常见签名算法:RSA、DSA、ECDSA、EdDSA 特性对比
签名算法是密码学里的「老黄牛」—— 平时不显山露水,一旦出问题就是灾难性的。我这些年排查过的漏洞里,至少有一半跟算法选型或实现细节有关。今天咱们就把四种主流签名算法掰开揉碎,看看它们各自的门道。
RSA 签名:老牌劲旅,但坑不少
RSA 应该是大家最熟悉的签名算法了。它的核心逻辑很简单:用私钥加密摘要,用公钥解密验证。但这里有个容易翻车的地方——填充方案。
⚠️ 避坑指南: 我曾经接手过一个项目,对方用了 RSA 的 PKCS#1 v1.5 填充,结果被 Bleichenbacher 攻击打得满地找牙。后来我强制团队全部迁移到 PSS 填充,虽然性能稍微降了点,但安全性上了个大台阶。
RSA 签名有几个关键参数:
- 密钥长度:2048 位是底线,4096 位更稳妥。1024 位?别想了,那已经是上个世纪的事了。
- 哈希算法:SHA-256 起步,别再用 SHA-1 了。我见过有人用 SHA-1 签名的证书,浏览器直接飘红。
- 签名长度:固定等于密钥长度。2048 位 RSA 签名就是 256 字节,这个特性在某些场景下会带来麻烦。
DSA 签名:数字签名标准,但有点过时
DSA 是美国国家标准局推出的数字签名标准。它基于离散对数难题,跟 RSA 的数学原理完全不同。
说实话,DSA 现在用得越来越少了。为什么?
- 性能一般:签名速度比 RSA 慢,验证速度更慢。
- 需要随机数:每次签名都要生成一个随机数 k。这个 k 如果泄露,私钥就完蛋了。我见过一个案例,某厂商的随机数生成器有 bug,导致 k 值重复,攻击者直接算出了私钥。
- 签名长度不固定:DSA 签名由 (r, s) 两个整数组成,长度取决于密钥大小。
💡 个人建议: 除非你要兼容老系统,否则别碰 DSA。ECDSA 是更好的替代方案。
ECDSA 签名:椭圆曲线版的 DSA
ECDSA 就是把 DSA 搬到了椭圆曲线上。好处很明显:同样的安全强度,密钥更短,签名更小。
举个例子:
| 安全强度 | RSA 密钥长度 | ECDSA 密钥长度 |
|---|---|---|
| 80 位 | 1024 位 | 160 位 |
| 112 位 | 2048 位 | 224 位 |
| 128 位 | 3072 位 | 256 位 |
你看,256 位的 ECDSA 就能达到 3072 位 RSA 的安全强度。这在物联网、移动端这些资源受限的场景下特别有用。
但 ECDSA 也有自己的坑:
- 曲线选择:不是所有曲线都安全。NIST P-256 是主流选择,但有些人担心 NIST 曲线可能有后门。我个人更倾向于 Curve25519。
- 随机数问题:跟 DSA 一样,ECDSA 也需要安全的随机数。索尼 PS3 的私钥泄露事件就是血淋淋的教训——他们用了固定的 k 值。
- 实现复杂度:椭圆曲线运算比 RSA 复杂,实现不当容易引入侧信道漏洞。
EdDSA 签名:现代密码学的宠儿
EdDSA 是 Edwards 曲线数字签名算法,最著名的实现是 Ed25519。它可以说是目前最优雅的签名算法。
为什么我这么说?
- 确定性签名:不需要随机数!签名过程完全确定,彻底杜绝了随机数泄露的风险。
- 性能极佳:签名和验证都比 ECDSA 快,而且常数时间执行,天然抗侧信道攻击。
- 签名小:Ed25519 的签名只有 64 字节,公钥 32 字节。
- 设计简洁:整个算法设计得非常干净,实现起来不容易出错。
🔑 核心观点: 如果让我在新项目里选签名算法,EdDSA 是我的首选。RSA 和 ECDSA 只有在兼容性要求下才会考虑。
四种算法特性对比
咱们用一张表把关键特性列清楚:
| 特性 | RSA | DSA | ECDSA | EdDSA |
|---|---|---|---|---|
| 数学基础 | 大整数分解 | 离散对数 | 椭圆曲线离散对数 | Edwards 曲线 |
| 密钥长度 (128 位安全) | 3072 位 | 3072 位 | 256 位 | 256 位 |
| 签名长度 | 固定 (如 256 字节) | 可变 (约 64 字节) | 可变 (约 64 字节) | 固定 (64 字节) |
| 签名速度 | 慢 | 较慢 | 快 | 非常快 |
| 验证速度 | 快 | 慢 | 较快 | 非常快 |
| 随机数需求 | 无 (PSS 填充需盐值) | 需要 | 需要 | 不需要 |
| 抗量子攻击 | 弱 | 弱 | 弱 | 弱 |
| 主流应用 | HTTPS 证书、SSH | DSS 标准 (逐渐淘汰) | 区块链、TLS 1.3 | SSH、Signal、区块链 |
算法选型决策流程
下面这张图是我自己总结的选型思路,帮你快速决策:
实际项目中的选择建议
说了这么多理论,咱们聊聊实际落地。我这些年参与过的项目,选型逻辑大致是这样的:
- Web 服务 / API 签名:首选 Ed25519。性能好,签名短,实现简单。如果客户端不支持,退而求其次用 ECDSA P-256。
- HTTPS 证书:目前还是 RSA 2048 位的天下,但 ECDSA 证书越来越多了。我建议双证书策略——RSA 做兼容,ECDSA 给现代浏览器。
- 区块链 / 加密货币:ECDSA 是主流(比特币、以太坊),但 EdDSA 正在快速崛起(Cardano、Stellar)。
- 物联网设备:EdDSA 是王者。资源占用少,签名快,确定性签名省去了随机数生成器的麻烦。
- 政府 / 金融系统:通常要求使用国家标准算法。国内是 SM2,美国是 ECDSA 或 RSA。这个没得选,合规优先。
💡 我的经验: 选算法的时候,别只看技术指标。要考虑你的上下游系统支持什么,密钥管理工具链是否成熟,团队对算法的熟悉程度。技术选型从来不只是技术问题。