返回列表
RSA加密填充与安全注意事项
为什么需要填充?
RSA加密的原始运算c ≡ m^e (mod n)直接使用会带来多种安全问题:
- 确定性加密:相同明文产生相同密文,泄露信息。
- 小指数攻击:若e较小且m也小,可能m^e < n,密文可开e次方直接得到m。
- 适应性选择密文攻击:攻击者可通过询问解密预言机破解。
因此,实际使用必须添加随机填充方案。
常见填充方案
1. PKCS#1 v1.5 填充
旧标准,格式为:0x00 || 0x02 || 随机非零字节 || 0x00 || 数据。优点是简单,但存在Bleichenbacher攻击等风险,目前已不推荐用于新系统。
2. OAEP(最优非对称加密填充)
现代推荐方案,使用MGF1掩码生成函数,提供更强的安全性证明。OAEP可抵抗选择密文攻击,已成为RSA加密标准(RFC 8017)。
签名填充
对于签名,通常使用PSS(概率签名方案)或PKCS#1 v1.5签名填充。PSS提供可证明安全性,推荐使用。
实际使用建议
- 加密:使用OAEP填充,避免使用PKCS#1 v1.5。
- 签名:优先使用PSS,并配合SHA-256以上哈希算法。
- 库函数:使用OpenSSL的`RSA_public_encrypt`时选择`RSA_PKCS1_OAEP_PADDING`;使用`openssl_sign`时默认使用PKCS#1 v1.5,若需PSS需额外设置。
常见安全漏洞
- 未使用填充直接加密。
- 忽略填充检查导致padding oracle攻击。
- 使用已弃用的PKCS#1 v1.5加密。
- 签名时使用弱哈希(如MD5、SHA-1)。
正确的填充方案是RSA安全应用的关键,开发者应使用标准库提供的高层接口,避免自行实现。