本文由云+社区发表

作者:mariolu

一、什么是PSS模式?

1.1、两种签名方式之一RSA-PSS

PSS (Probabilistic Signature Scheme)私钥签名流程的一种填充模式。目前主流的RSA签名包括RSA-PSS和RSA-PKCS#1 v1.5。相对应PKCS(Public Key Cryptography Standards)是一种能够自我从签名,而PSS无法从签名中恢恢复原来的签名。openssl-1.1.x以后默认使用更安全的PSS的RSA签名模式。

1.2、填充的必要性

RSA算法比较慢,一般用于非对称加密的private key签名和public key验证。因RSA算法沒有加入乱数,当出现重复性的原始资料,攻击者会通过相同加密密文而猜测出原文,因此导入padding的机制來加強安全性。

TLS流程中的密钥材料若不进行填充而直接加密,那么显然相同的key,会得到相同的密文。这种在语义上来说,是不安全的。以下例子说明了无填充模式的安全漏洞。

  • m:明文
  • e,n:RSA参数(公钥)
  • d:RSA参数(私钥)
  • c:网络传输密文

加密方加密m:c = m^e mod n,传输c

解密方解密c:m = c^d mod n,还原m

  • c':篡改密文
  • k:篡改码

由于c在网络上传输,如果网络上有人对其进行c' = c*k^e mod n,这样的替换

那么解密方将得到的结果是

(c*k^e)^d mod n

= (c^d mod n)* (k^ed mod n)

= m*k

即中间人有办法控制m。

1.3、PSS的基本要素

使用PSS模式的RSA签名流程如下:

图1、RSA-PSS的填充模式

相比较PKCS#1 v1.5的padding简单许多:

图2、RSA-PKCS#v1.5的填充模式

PSS的一些概念:

  • hash算法,一般使用SHA-1
  • MGF函数(mask generation function)。默认是MGF1。
  • salt length,一般由hLen决定。当为0时,签名值变成了唯一确定的。
  • 截断符号,一般是0xbc

二、RSA签名实际操作

这节例子中所涉及到的文件说明:

/tmp/wildcard_domain.sports.qq.com.v2.key:私钥

/tmp/pub: 公钥

/tmp/data: 明文

/tmp/endata: 密文

/tmp/sign: 签名

/tmp/de_sign: 解签名

2.1、前期准备:公钥和私钥

  • 通过key文件提取出public key
openssl rsa -in /usr/local/services/ssl_agent/ca/wildcard_domain.sports.qq.com.v2.key -pubout -out /tmp/pub
  • 原始数据:

echo -n "1234567890" > /tmp/data

  • 这样就有一对公钥和私钥,用来测试RSA加密解密(encrypt、decrypt)和签名验证(sign,verify)
  • RSA加密的两种算法分别是RSAES-PKCS-v1_5 and RSAES-OAEP。

2.2、加密和解密(encrypt,decrypt)

  • 加密:
openssl rsautl -pubin -inkey /tmp/data -in /tmp/data -encrypt -out /tmp/endata
  • 解密,用private key解密,得到原本的值:
openssl rsautl -inkey /tmp/wildcard_domain.sports.qq.com.v2.key -in /tmp/en_data -decrypt

2.3、签名和验证(sign, verify)

签名过程包括hash和加密。hash函数一般使用sha1。这样输入明文,直接生成sign签名。

如果是私钥签名所做的事就是先hash再加密,选择一种hash算法把原始消息计算后成ASN1格式,再把这个资料用private key加密后送出,资料本身不加密,这种方式主要是用來验证资料来源是否可信任的,送出時把原始资料和签名一起送出。

  • 签名:
openssl sha1 -sign /tmp/wildcard_domain.sports.qq.com.v2.key  /tmp/data > /tmp/data/sign/tmp/data/sign
  • 解开签名:
openssl rsautl -pubin -inkey /tmp/pub -in sign -verify -out /tmp/de_sign 

用public key解开签名,并且保留padding

 openssl rsautl -pubin -inkey /tmp/pub -in /tmp/sign -encrypt -raw -hexdump

使用解开ASN1解开签名,或者签名后用ASN1工具解析

openssl rsautl -pubin -inkey /tmp/pub -in /tmp/sign -verify -asn1parse

或者:

openssl asn1parse -inform der -in /tmp/de_sign

和本地sha1对比

openssl sha1 /tmp/data

如果两者hash结果是一样,那么确定签名送过来是正确的。

2.4、openssl rsautl工具支持的填充模式

openssl rsautl --help,可以看到支持的padding模式有,在rsautl加上以下选项可以重复做2.2~2.3的实验。

 -ssl                     Use SSL v2 padding-raw                     Use no padding-pkcs                    Use PKCS#1 v1.5 padding (default)-oaep                    Use PKCS#1 OAEP

三、PSS填充模式的特点

PSS是RSA的填充模式中的一种。

完整的RSA的填充模式包括:

RSA_SSLV23_PADDING(SSLv23填充)
RSA_NO_PADDING(不填充)
RSA_PKCS1_OAEP_PADDING (RSAES-OAEP填充,强制使用SHA1,加密使用)
RSA_X931_PADDING(X9.31填充,签名使用)
RSA_PKCS1_PSS_PADDING(RSASSA-PSS填充,签名使用)
RSA_PKCS1_PADDING(RSAES-PKCS1-v1_5/RSASSA-PKCS1-v1_5填充,签名可使用)

其中主流的填充模式是PKCS1和PSS模式。

PSS的优缺点如下:

  • PKCS#1 v1.5比较简易实现,但是缺少security proof。
  • PSS更安全,所以新版的openssl-1.1.x优先使用PSS进行私钥签名(具体在ssl握手的server key exchange阶段)

此文已由腾讯云+社区在各渠道发布

获取更多新鲜技术干货,可以关注我们腾讯云技术社区-云加社区官方号及知乎机构号

RSA签名的PSS模式相关推荐

  1. php rsa pss,RSA签名的PSS模式

    本文由云+社区发表 作者:mariolu 一.什么是PSS模式? 1.1.两种签名方式之一RSA-PSS PSS (Probabilistic Signature Scheme)私钥签名流程的一种填充 ...

  2. php+rsa生成签名sign,PHP 做 RSA 签名 生成订单(支付宝例子)

    /组合签名 $a=time(); $b=substr($a, 1); //生成随机订单号 $orderid= $b.mt_rand(10000,99999); //合作身份者id,以2088开头的16 ...

  3. RSA加密的填充模式

    http://blog.chinaunix.net/uid-21880738-id-1813144.html 跟DES,AES一样, RSA也是一个块加密算法( block cipher algori ...

  4. Java 实现RSA签名和加密

    Java 实现RSA签名和加密 RSA在1977年发明,是公钥加密方式的事实标准,名称有其三位作者首字母组成.本文我们介绍Java中如何使用RSA实现加密和签名. RSA属于非对称加密算法,有两个密钥 ...

  5. 支付宝签名php,PHP实现RSA签名生成订单功能【支付宝示例】

    PHP实现RSA签名生成订单功能[支付宝示例] 来源:中文源码网    浏览: 次    日期:2018年9月2日 [下载文档:  PHP实现RSA签名生成订单功能[支付宝示例].txt ] (友情提 ...

  6. C语言——基于OpenSSL 的RSA 签名验签算法

    OpenSSL开源工程中,实现RSA签名方法有多种.该方法基于OpenSSL 3.0版本,调用OpenSSL EVP层的EVP_DigestSign*()与EVP_DigestVerify*()实现p ...

  7. PHP RSA签名

    /**  * RSA签名  * @param $data 待签名数据  * @param $private_key 私钥字符串  * return 签名结果  */ function rsaSign( ...

  8. java/php/c#版rsa签名以及java验签实现--转

    在开放平台领域,需要给isv提供sdk,签名是Sdk中需要提供的功能之一.由于isv使用的开发语言不是单一的,因此sdk需要提供多种语言的版本.譬如java.php.c#.另外,在电子商务尤其是支付领 ...

  9. [crypto]-53-openssl命令行的使用(aes/rsa签名校验/rsa加密解密/hmac)

    常用技巧 如何编写一个二进制规律性的文件, 比如你可以编写一个"0123456789abcdef"的文本文件,记得删除换行符然后用ultraedit打开,ctrl+H就可以看到二进 ...

最新文章

  1. 人工智能:看看BAT三巨头怎么说
  2. 数据洪流时代的芯片之变
  3. 解读dbcp自动重连那些事---转载
  4. 分享到facebook链接原格式_神马?!你还不知道Facebook广告怎么操作?
  5. RocketMQ消息发送之pull和push
  6. VS 2019 16.11正式发布 | 新功能(Hot Reload 热重载)试用
  7. 马上开课 | 临床基因组学数据分析实战助力解析Case,快速发表文章
  8. 如何设置MongoDB快捷启动?
  9. android leaks工具,Androidx中ImmLeaksCleaner已经解决了InputMethodManager... - 简书
  10. [读书笔记] 有效竞品分析
  11. 【HTML 5】HTML5 Canvas rect(), strokeRect() 和 fillRect() 的区别
  12. notepad++安装(kali 64位)
  13. 【面试系列三】面试是面试者与面试官的双向沟通,如何抓住面试官的小尾巴以及面试过程中需要避开的一些减分项!
  14. 横空出世的作业APP,会继续走俏还是就此堕落?
  15. metaWRAP bin_refine 模块如何优化分箱结果
  16. 【中兴交换机MC-LAG配置】
  17. linux操作系统实验教程费翔林,实验一操作系统接口实验.doc
  18. mpos php,MPOS
  19. Codeforces--44A--Indian Summer
  20. win10右键菜单添加“用记事本打开文件”

热门文章

  1. libev源码解析——I/O模型
  2. 海思3559A上编译LIVE555源码操作步骤
  3. C/C++中static关键字用法汇总
  4. 如何运行ImageMagick的命令行工具
  5. 【linux】Valgrind工具集详解(九):Memcheck检查的内容和方法
  6. java全站_javaWeb_全站编码
  7. cs架构嵌入bs_CS与BS架构区别、比较、及现状与趋势分析
  8. python3实用编程技巧_适合Python初学者的一些编程技巧
  9. java配置文件实现方式_java相关:详解Spring加载Properties配置文件的四种方式
  10. idea上java接口自动化_Java接口自动化之IDEA创建及运行maven项目