RSA签名的PSS模式

qcloudcommunity · · 3095 次点击 · 开始浏览    置顶
这是一个创建于 的主题,其中的信息可能已经有所发展或是发生改变。

> 本文由云+社区发表 > 作者: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签名流程如下:** ![img](https://ask.qcloudimg.com/draft/1198598/lpi6d693bw.png?imageView2/2/w/1620)图1、RSA-PSS的填充模式 相比较PKCS#1 v1.5的padding简单许多: ![img](https://ask.qcloudimg.com/draft/1198598/dzur37nno1.png?imageView2/2/w/1620)图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 ```javascript 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) - 加密: ```javascript openssl rsautl -pubin -inkey /tmp/data -in /tmp/data -encrypt -out /tmp/endata ``` - 解密,用private key解密,得到原本的值: ```javascript 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加密后送出,资料本身不加密,这种方式主要是用來验证资料来源是否可信任的,送出時把原始资料和签名一起送出。 - 签名: ```javascript 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阶段) **此文已由腾讯云+社区在各渠道发布** **获取更多新鲜技术干货,可以关注我们[腾讯云技术社区-云加社区官方号及知乎机构号](https://www.zhihu.com/org/teng-xun-yun-ji-zhu-she-qu/activities)**

有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

3095 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传