用于数字签名的 RSA-PSS
了解 PSS 编码和盐值,以及它为何取代 PKCS#1 v1.5 用于签名
用于数字签名的 RSA-PSS 是 CoddyKit 上的免费 Cryptology Academy 课时。 这是第 4 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Cryptology Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Cryptology Academy 课程共包含 4 节课。
欢迎
RSA-PSS(概率签名方案)是 PKCS#1 v1.5 签名的安全替代方案。它使用随机编码,提供可证明安全的签名。
PKCS#1 v1.5 签名的弱点
PKCS#1 v1.5 签名使用确定性的 DigestInfo 编码。已知的伪造攻击会利用验证实现中的宽松处理。布莱肯巴赫在 2006 年展示了针对某些验证器的签名伪造攻击。
PSS 设计目标
贝拉雷–罗加韦在 1996 年提出:PSS 加入随机盐值,使签名具有概率性。每次签名都会产生不同的签名。在随机预言机模型中,它具有可证明的安全性,并且能够紧密归约到 RSA 难题。
PSS 编码步骤
1. mHash = Hash(M)
2. salt = random(sLen bytes)
3. M' = 0x00×8 || mHash || salt
4. H = Hash(M')
5. DB = PS || 0x01 || salt
6. dbMask = MGF1(H, emLen - hLen - 1)
7. maskedDB = DB XOR dbMask
8. EM = maskedDB || H || 0xbc
盐值长度选择
PKCS#1 v2.2 选项:
- MAX_LENGTH:盐值与哈希值一样长(推荐,安全性最高)
- DIGEST_LENGTH:盐值等于哈希值长度(标准选项)
- 0:确定性 PSS(失去概率性,不推荐)
Python:padding.PSS.MAX_LENGTH
PSS 验证
恢复 EM = sig^e mod n。解析 maskedDB 和 H。根据 mHash(由消息计算)以及恢复出的盐值计算 M'。验证 H == Hash(M')。盐值不需要匹配,只需验证 H 即可。
PSS 与 v1.5 的安全性比较
PSS:具有可证明的安全性、紧密归约和概率性签名,但计算量略大。
v1.5:依靠启发式安全性、具有确定性、速度更快,但容易受到格式预言机攻击。
所有新代码都应使用 PSS。
TLS 1.3 中的 PSS
TLS 1.3 要求所有 RSA 签名都使用 RSA-PSS。新的 TLS 1.3 扩展禁止使用 PKCS#1 v1.5。签名算法包括:rsa_pss_rsae_sha256、rsa_pss_rsae_sha384、rsa_pss_rsae_sha512。
Python 中的 PSS
from cryptography.hazmat.primitives.asymmetric import padding
from cryptography.hazmat.primitives import hashes
# Sign
sig = private_key.sign(
message,
padding.PSS(mgf=padding.MGF1(hashes.SHA256()), salt_length=padding.PSS.MAX_LENGTH),
hashes.SHA256()
)
RSASSA-PSS OID
RSA-PSS 有自己的密钥类型 OID:id-RSASSA-PSS (1.2.840.113549.1.1.10)。专门为 PSS 生成的密钥使用此 OID,并要求使用 PSS 签名(不能与 v1.5 配合使用)。这是新部署的最佳实践。
截断哈希与盐值建议
当 salt_length = hash_length 时,PSS 的安全性 = min(|modulus|/2, |hash|) - 1 位。对于使用 SHA-256 的 RSA-2048:安全性为 128 位。请匹配安全等级:使用 RSA-3072 + SHA-384 可达到 192 位安全性。
快速检查
与 PKCS#1 v1.5 相比,是什么使 RSA-PSS 签名具有“概率性”?
回顾
RSA-PSS 是使用 RSA 进行签名的安全方式。接下来我们将掌握椭圆曲线密码学,理解曲线的几何结构和代数。
常见问题解答
「用于数字签名的 RSA-PSS」课时是免费的吗?
是的 — 「用于数字签名的 RSA-PSS」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Cryptology Academy 课程的其余内容,请升级到 CoddyKit PRO。 Cryptology Academy 课程共包含 4 节课。
「用于数字签名的 RSA-PSS」这节课中我会学到什么?
了解 PSS 编码和盐值,以及它为何取代 PKCS#1 v1.5 用于签名 你通过在浏览器中直接运行的动手代码来练习 Cryptology Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Cryptology Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Cryptology Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 4 节课,共 4 节。
「用于数字签名的 RSA-PSS」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Cryptology Academy 课中编写并运行代码吗?
能。每节 Cryptology Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。