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 选型决策框架
说了这么多,到底怎么选?我总结了一个决策流程,你照着走就行。
这个流程我用了好几年,基本没出过问题。核心逻辑就是:合规优先,性能次之,兼容性兜底。
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 年才标准化的算法,能这么快被业界接受,肯定是有道理的。