首页/安全/加密与证书速查/RSA-PSS 概率签名
加密算法基础95 条

RSA-PSS 概率签名

RFC 8017 §8.1 定义的概率签名方案:签名前引入随机盐,安全性有可证明的界;TLS 1.3 与代码签名场景推荐使用。

加密与证书速查安全更新于 2026-10-13

RSA-PSS 是什么

RSA-PSS 是 RFC 8017 §8.1 定义的概率签名方案。与 PKCS#1 v1.5 的确定性填充不同,它在生成签名时引入随机盐,因此同一份数据每次签名结果都不同,攻击者也无法通过比较签名判断消息内容,安全性有可证明的界。TLS 1.3 要求握手签名使用 PSS(如 rsa_pss_rsae_sha256),代码签名场景同样普遍推荐。

基本信息

标准RFC 8017 §8.1(RSASSA-PSS)
盐长度常用等于哈希输出长度,SHA-256 对应 32 字节
TLS 1.3 签名rsa_pss_rsae_sha256、rsa_pss_pss_sha256 等
对比 v1.5同长度下安全性论证更完整,且签名随机化
验签要求双方盐长度策略必须一致
迁移现状老客户端对 PSS 支持不完整,需按能力选择

典型使用场景

  • 新增代码签名与内部 PKI:优先选择支持 PSS 的签名方案
  • TLS 1.3 站点与客户端验证:握手签名要求支持 PSS
  • 内部根与中间证书签发:用 PSS 为下级证书签名
  • 兼容老客户端:对外接口保留 v1.5 验签能力并做能力普查
  • 排查验签失败:先确认双方盐长度与摘要算法是否一致

签名与验签

签名与验签
# 签名:显式指定 PSS 填充与盐长度,不要依赖工具默认值
openssl dgst -sha256 -sigopt rsa_padding_mode:pss -sigopt rsa_pss_saltlen:32 -sign rsa.key -out sig.bin data.bin
# 验签:两侧参数必须完全一致
openssl dgst -sha256 -sigopt rsa_padding_mode:pss -sigopt rsa_pss_saltlen:32 -verify rsa.pub -signature sig.bin data.bin
# 查看证书实际使用的签名算法
openssl x509 -in cert.pem -noout -text | grep -i 'Signature Algorithm'

PSS 与 v1.5 对照

维度RSA-PSSPKCS#1 v1.5
填充方式随机盐,签名不确定确定性填充,同一消息签名相同
安全论证有可证明的界依赖更强的假设
新系统建议优先使用仅用于兼容老客户端
TLS 1.3握手签名要求支持不用于握手签名
验签方必须使用相同的盐长度策略;多数库默认盐长度等于哈希长度,显式指定可以避免跨平台差异。
签名随机化是预期行为:同一份数据每次签名的输出都不同,因此不要用签名结果做去重、缓存键或相等性判断。
迁移顺序建议:新签发的证书与内部系统先上 PSS,对外接口保留 v1.5 验签能力,等客户端能力摸清后再收紧。

易错点

  • 盐长度写成 -1(等于摘要长度)在部分工具版本中含义不同,脚本中建议显式写数值
  • 同一条证书链混用 v1.5 与 PSS 签名时,老客户端可能不支持 PSS 验签
  • 用签名结果做去重或缓存键:PSS 每次输出都不同,会得到意料之外的结果
  • 只升级签发侧而不评估验签侧能力,会出现对方无法验证签名的情况
  • 以为换 PSS 能弥补密钥长度不足:位数不够仍是根本问题

数据来源与参考

  • RFC 8017 §8.1(RSASSA-PSS)
  • RFC 8446(TLS 1.3 签名算法)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌