3、主流签名算法概览:RSA、ECDSA、Ed25519、SM2 的对比与选型

做跨平台签名验签,选算法是第一道坎。选错了,后面全是坑。

我见过不少团队,上来就拍脑袋用 RSA 2048,理由是“大家都这么用”。结果到了 IoT 设备上,签名慢得离谱,密钥存储也成了难题。说白了,没有万能算法,只有最适合场景的算法。

这一章,我把四种主流算法掰开揉碎讲清楚。你听完就能知道,什么场景该选谁。

3.1 四大算法核心差异

先看一张总览表,心里有个底。

特性 RSA ECDSA Ed25519 SM2
数学基础 大整数分解 椭圆曲线离散对数 扭曲爱德华曲线 国密椭圆曲线
密钥长度(安全等价) 2048 bit 256 bit 256 bit 256 bit
签名速度 慢 快 极快 快
验签速度 快 快 极快 快
签名大小 256 字节 64-72 字节 64 字节 64-72 字节
公钥大小 256 字节 33-65 字节 32 字节 33-65 字节
抗量子攻击 弱 弱 弱 弱
标准化组织 PKCS#1 ANSI X9.62 / FIPS 186 RFC 8032 GB/T 32918

关键结论:同等安全强度下,椭圆曲线类算法(ECDSA、Ed25519、SM2)的密钥和签名都比 RSA 短得多。这意味着更少的网络传输、更小的存储开销。

3.2 RSA:老当益壮,但别滥用

RSA 是签名算法里的老大哥。从 1977 年到现在,四十多年了,依然坚挺。为什么?因为它的数学原理简单、直观,审计起来也容易。

但我个人习惯是:能用椭圆曲线就别用 RSA。原因很简单——性能。

我在项目中遇到过一件事:一个支付系统,每秒要处理上万笔交易。一开始用的 RSA 2048 签名,结果 CPU 直接飙到 80%。换成 ECDSA 后,降到了 15%。你想想看,这差距有多大。

避坑指南:我曾经踩过一个坑——RSA 的密钥生成非常慢。在嵌入式设备上生成 4096 位密钥,等了将近两分钟。后来我改成在服务端预生成,再安全分发下去。记住:RSA 适合验签密集、签名稀疏的场景,比如证书链验证。

RSA 的签名大小是硬伤。2048 位密钥对应 256 字节签名。在区块链场景里,每个交易都要带签名,256 字节乘以几百万笔交易,存储成本就上去了。

3.3 ECDSA:椭圆曲线的经典选择

ECDSA 是椭圆曲线数字签名算法的标准实现。它用更短的密钥达到了 RSA 同等的安全强度。

举个例子:256 位的 ECDSA 密钥,安全性和 3072 位的 RSA 差不多。但密钥长度只有后者的十分之一。

ECDSA 有个麻烦事——随机数质量要求极高。每次签名都要生成一个真随机数 k。如果 k 值重复或可预测,私钥就泄露了。

经验之谈:我建议你在实现 ECDSA 时,务必使用 RFC 6979 的确定性签名方案。它用 HMAC 从私钥和消息派生出 k 值,彻底避免了随机数问题。我在一个金融项目中用了这个方案,再也没担心过随机数生成器出故障。

ECDSA 的曲线选择也很关键。最常用的是 NIST P-256(secp256r1)。但要注意,有些老旧平台不支持 P-521 或 P-384,兼容性测试一定要做全。

3.4 Ed25519:新一代性能王者

Ed25519 是我个人最喜欢的签名算法。没有之一。

它基于扭曲爱德华曲线,设计上就比 ECDSA 更安全、更快。签名和验签速度都是 ECDSA 的 2-3 倍。而且它天然抗侧信道攻击,实现起来不容易出错。

Ed25519 的公钥只有 32 字节,签名 64 字节。这在移动端和 IoT 设备上简直是福音。

核心优势:Ed25519 的签名过程是确定性的,不需要随机数生成器。这意味着你不用担心随机数质量问题。而且它支持批量验签——一次验签多个签名,速度还能再翻倍。

不过 Ed25519 也有短板。它的标准化时间较晚(2017 年才进 RFC 8032),有些老旧系统不支持。我在一个遗留系统中集成 Ed25519 时,发现对方的 OpenSSL 版本太老,根本不认识这个算法。最后只能升级库版本。

3.5 SM2:国密标准,合规必选

SM2 是中国国家密码管理局发布的椭圆曲线公钥密码算法。如果你做的是国内政务、金融、医疗等合规项目,SM2 是强制要求。

从技术角度看,SM2 和 ECDSA 非常相似。都是基于椭圆曲线,密钥长度都是 256 位。但 SM2 的曲线参数是国产自研的,和 NIST 曲线不同。

SM2 的签名流程和 ECDSA 略有差异。它使用了不同的哈希函数(SM3)和密钥派生方式。我在一个银行项目中做过 SM2 的跨平台集成,发现不同厂商的实现细节有细微差别,尤其是签名编码格式。

注意:SM2 的签名结果有两种编码方式:DER 编码和原始编码。有些平台默认输出 DER,有些输出原始字节。我在对接时吃过这个亏——两边都以为对方会做格式转换,结果验签一直失败。后来统一约定用 DER 编码才解决。

SM2 的性能和 ECDSA 相当。但要注意,SM2 的生态不如 RSA 和 ECDSA 成熟。一些开源库对 SM2 的支持不够完善,需要额外打补丁。

3.6 选型决策框架

说了这么多,到底怎么选?我总结了一个决策流程,你照着走就行。

签名算法选型决策流程 开始选型 有国密合规要求? (政务/金融/医疗等) 是 SM2 国密合规首选 否 性能要求极高? (高并发/低功耗设备) 是 Ed25519 性能王者 否 需要广泛兼容性? (老旧系统/跨平台) 是 RSA 兼容性最佳 否 ECDSA 经典均衡选择 说明: 如果同时有合规和性能要求,优先满足合规(SM2)。 如果兼容性和性能都重要,建议用 ECDSA 作为折中方案。

这个流程我用了好几年,基本没出过问题。核心逻辑就是:合规优先,性能次之,兼容性兜底。

3.7 实战选型建议

最后,我直接给你几个具体场景的推荐方案。

  • Web 服务端 API 签名:首选 Ed25519。性能好,密钥短,实现简单。如果客户端环境老旧,退而求其次用 ECDSA P-256。
  • 移动端 App 签名:Ed25519 或 ECDSA。移动端 CPU 资源有限,RSA 签名太慢。我做过测试,Ed25519 在 ARM 芯片上比 RSA 快 10 倍。
  • IoT 设备固件签名:Ed25519。密钥和签名都短,适合存储空间受限的设备。验签速度也快,不影响设备启动时间。
  • 金融/政务系统:SM2。这是合规红线,没得选。如果涉及跨境业务,可以同时支持 SM2 和 ECDSA,根据对方要求切换。
  • 区块链交易签名:Ed25519 或 ECDSA。签名大小直接影响交易吞吐量。以太坊用 ECDSA,Solana 用 Ed25519,各有拥趸。
  • 证书链验证(CA/PKI):RSA。证书链场景里,验签次数远多于签名次数。RSA 的验签速度不慢,而且兼容性最好。X.509 证书对 RSA 的支持最成熟。

我的习惯:新项目一律用 Ed25519。除非有明确的合规或兼容性要求,否则我不会主动选 RSA 或 ECDSA。Ed25519 的设计更现代,实现更安全,性能也更好。你想想看,一个 2017 年才标准化的算法,能这么快被业界接受,肯定是有道理的。