本文由云+社区发表javascript
做者:mariolujava
PSS (Probabilistic Signature Scheme)私钥签名流程的一种填充模式。目前主流的RSA签名包括RSA-PSS和RSA-PKCS#1 v1.5。相对应PKCS(Public Key Cryptography Standards)是一种可以自我从签名,而PSS没法从签名中恢恢复原来的签名。openssl-1.1.x之后默认使用更安全的PSS的RSA签名模式。算法
RSA算法比较慢,通常用于非对称加密的private key签名和public key验证。因RSA算法沒有加入乱数,当出现重复性的原始资料,攻击者会经过相同加密密文而猜想出原文,所以导入padding的机制來加強安全性。安全
TLS流程中的密钥材料若不进行填充而直接加密,那么显然相同的key,会获得相同的密文。这种在语义上来讲,是不安全的。如下例子说明了无填充模式的安全漏洞。bash
加密方加密m:c = m^e mod n,传输c网络
解密方解密c:m = c^d mod n,还原mdom
因为c在网络上传输,若是网络上有人对其进行c' = c*k^e mod n,这样的替换函数
那么解密方将获得的结果是工具
(c*k^e)^d mod n测试
= (c^d mod n)* (k^ed mod n)
= m*k
即中间人有办法控制m。
使用PSS模式的RSA签名流程以下:
相比较PKCS#1 v1.5的padding简单许多:
PSS的一些概念:
这节例子中所涉及到的文件说明:
/tmp/wildcard_domain.sports.qq.com.v2.key:私钥
/tmp/pub: 公钥
/tmp/data: 明文
/tmp/endata: 密文
/tmp/sign: 签名
/tmp/de_sign: 解签名
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
openssl rsautl -pubin -inkey /tmp/data -in /tmp/data -encrypt -out /tmp/endata
复制代码
openssl rsautl -inkey /tmp/wildcard_domain.sports.qq.com.v2.key -in /tmp/en_data -decrypt
复制代码
签名过程包括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结果是同样,那么肯定签名送过来是正确的。
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是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的优缺点以下:
此文已由腾讯云+社区在各渠道发布
获取更多新鲜技术干货,能够关注咱们腾讯云技术社区-云加社区官方号及知乎机构号