返回列表
RSA签名与验签原理
数字签名概述
数字签名用于验证消息的完整性和身份认证。RSA签名利用私钥生成签名,公钥验证,满足:
- 不可否认性:只有私钥持有者能生成有效签名。
- 完整性:签名可证明消息未被篡改。
- 真实性:验证方可确认消息来源。
RSA签名算法
基本流程:
- 哈希:对消息m进行哈希,得到固定长度摘要H(m)。
- 签名:使用私钥(d, n)对哈希值进行模幂运算:s ≡ H(m)^d (mod n)。
- 验证:使用公钥(e, n)计算H'(m) ≡ s^e (mod n),若等于H(m)则签名有效。
实际实现中,哈希值在签名前会经过填充(如PSS或PKCS#1 v1.5),以防止伪造。
签名与加密的区别
| 特性 | 加密 | 签名 |
|---|---|---|
| 密钥使用 | 公钥加密,私钥解密 | 私钥签名,公钥验签 |
| 目的 | 保密性 | 完整性、身份认证 |
| 输出 | 密文 | 签名值 |
| 填充 | OAEP | PSS / PKCS#1 v1.5 |
实际应用中的签名格式
在PKCS#7/CMS、JWT、X.509证书等标准中,RSA签名通常以ASN.1 DER编码存储,包含签名算法标识和签名值。常见算法标识如:
- sha256WithRSAEncryption
- sha384WithRSAEncryption
- sha512WithRSAEncryption
安全注意事项
- 避免使用弱哈希(MD5、SHA-1)生成签名。
- 验证签名时需检查哈希算法是否安全。
- 使用标准库的签名验证函数,避免自行实现比较。
- 注意时序攻击,使用常量时间比较。
RSA签名是数字身份验证的基础,广泛应用于SSL证书、代码签名、软件更新等场景。正确使用签名算法可有效防止伪造和篡改。