常见签名算法: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、区块链

算法选型决策流程

下面这张图是我自己总结的选型思路,帮你快速决策:

签名算法选型决策流程 需要签名算法 需要兼容老系统? 是 RSA (PSS填充) 否 资源受限或高性能? 是 EdDSA (Ed25519) 否 ECDSA (P-256) ⚠️ 注意:所有算法都不抗量子攻击,量子安全签名是另一个话题 DSA 已过时,除非维护遗留系统,否则不要选它

实际项目中的选择建议

说了这么多理论,咱们聊聊实际落地。我这些年参与过的项目,选型逻辑大致是这样的:

  • Web 服务 / API 签名:首选 Ed25519。性能好,签名短,实现简单。如果客户端不支持,退而求其次用 ECDSA P-256。
  • HTTPS 证书:目前还是 RSA 2048 位的天下,但 ECDSA 证书越来越多了。我建议双证书策略——RSA 做兼容,ECDSA 给现代浏览器。
  • 区块链 / 加密货币:ECDSA 是主流(比特币、以太坊),但 EdDSA 正在快速崛起(Cardano、Stellar)。
  • 物联网设备:EdDSA 是王者。资源占用少,签名快,确定性签名省去了随机数生成器的麻烦。
  • 政府 / 金融系统:通常要求使用国家标准算法。国内是 SM2,美国是 ECDSA 或 RSA。这个没得选,合规优先。
💡 我的经验: 选算法的时候,别只看技术指标。要考虑你的上下游系统支持什么,密钥管理工具链是否成熟,团队对算法的熟悉程度。技术选型从来不只是技术问题。