PKCS#1 v1.5 是什么
PKCS#1 v1.5 是最早的 RSA 填充方案,加密与签名共用同一套结构。作为加密方案它已不推荐:Bleichenbacher 在 1998 年给出的适应性选择密文攻击表明,只要解密侧对不同失败原因的响应可被区分,攻击者就能逐字节恢复明文。作为签名方案,它在兼容场景中仍被广泛使用,证书签名与 TLS 1.2 握手里都能见到。
基本信息
| 标准 | RFC 8017 §7.2(加密)、§9.2(签名) |
|---|---|
| 加密风险 | Bleichenbacher 1998 适应性选择密文攻击 |
| 签名现状 | 仍广泛用于证书与 TLS 1.2 |
| 推荐替代 | 加密改用 OAEP,签名改用 PSS |
| 哈希限制 | 应彻底禁用 SHA-1 |
| 使用前提 | 仅在必须兼容老系统时保留 |
典型使用场景
- 维护老系统:对方只支持 v1.5 验签时按兼容策略保留
- 迁移评估:盘点仍在使用 v1.5 加密的接口并安排替换
- 排查签名失败:确认双方填充方式与哈希算法是否一致
- 安全加固:把解密失败的响应与耗时统一化,避免暴露填充差异
- 代码审查:找出脚本里默认使用 v1.5 的签名调用并评估是否可升级
默认为 v1.5 的签名命令
默认为 v1.5 的签名命令
# openssl 的 dgst 默认使用 PKCS#1 v1.5 填充
openssl dgst -sha256 -sign rsa.key -out sig.bin data.bin
openssl dgst -sha256 -verify rsa.pub -signature sig.bin data.bin
# 显式指定 PSS,便于与 v1.5 的差异做对比
openssl dgst -sha256 -sigopt rsa_padding_mode:pss -sign rsa.key -out sig.pss data.bin
# 查看现有证书使用的签名算法
openssl x509 -in cert.pem -noout -text | grep -i 'Signature Algorithm'用途与替代方案
| 用途 | v1.5 的风险 | 替代方案 |
|---|---|---|
| 公钥加密 | 填充预言机攻击 | RSA-OAEP |
| 数字签名 | 安全论证较弱但可用 | RSA-PSS |
| 证书签名 | 老客户端只认它 | 新签发改用 PSS |
| 传递对称密钥 | 解密失败细节易被利用 | 优先用 ECDHE 协商会话密钥 |
新系统不要用 PKCS#1 v1.5 做公钥加密;若必须兼容,解密侧严禁对外区分各类失败原因,也不要有可测量的耗时差异。
签名场景同样有细节要求:填充结构决定了哈希算法标识的位置,混用不同哈希会导致验签失败,同时应彻底禁用 SHA-1。
常见的迁移路径是「新签发的用 PSS、验签侧两种都支持」:既保住老客户端,又能让新资产逐步切到更稳的方案。