4、签名算法详解:RSA、ECDSA、Ed25519 对比
签名算法是安全升级的「守门员」。选错了,整个升级链路就是纸糊的。
今天咱们把三个主流算法——RSA、ECDSA、Ed25519——掰开揉碎讲清楚。我会结合自己踩过的坑,告诉你什么场景该选谁。
4.1 RSA 签名算法:老牌劲旅,但有点「重」
RSA 诞生于 1977 年,至今仍是工业界最通用的签名方案。它的核心原理基于大整数分解难题——两个大素数相乘容易,但反过来分解极难。
核心特点:
- 支持签名和加密两种用途
- 密钥对生成:随机选两个大素数 p、q,计算 n = p × q
- 签名过程:对消息哈希做私钥指数运算
- 验签过程:用公钥指数运算恢复哈希并比对
我在一个 IoT 项目里用过 RSA-2048。当时觉得 2048 位够安全了,结果发现设备每次签名要算 5 秒——用户等得直骂娘。后来才明白,RSA 的私钥操作(签名)比公钥操作(验签)慢得多。
| 参数 | RSA-2048 | RSA-4096 |
|---|---|---|
| 公钥长度 | 256 字节 | 512 字节 |
| 签名长度 | 256 字节 | 512 字节 |
| 签名速度(相对) | 慢 | 非常慢 |
| 验签速度(相对) | 快 | 中等 |
| 安全等级 | 112 位 | 128 位 |
避坑指南:我曾经见过有人用 RSA-1024 做固件签名。NIST 早在 2013 年就禁止了 1024 位 RSA。别省那点计算资源,至少上 2048。
4.2 ECDSA 签名算法:更小的密钥,更高的性能
ECDSA(椭圆曲线数字签名算法)是 RSA 的现代替代者。它基于椭圆曲线离散对数难题——在曲线上找一个点很容易,但反推私钥几乎不可能。
说白了,ECDSA 用更短的密钥达到了和 RSA 同等的安全强度。256 位的 ECDSA 密钥 ≈ 3072 位的 RSA 密钥。
| 对比项 | RSA-2048 | ECDSA P-256 |
|---|---|---|
| 公钥长度 | 256 字节 | 32 字节 |
| 签名长度 | 256 字节 | 64 字节 |
| 签名速度 | 慢 | 快 |
| 验签速度 | 快 | 快 |
| 密钥生成速度 | 慢 | 极快 |
ECDSA 有个坑——它依赖高质量的随机数。如果随机数生成器出问题,私钥可能被恢复。2010 年索尼 PS3 的签名密钥泄露,就是因为用了固定的随机数 k。
我的建议:在嵌入式设备上用 ECDSA,一定要确认硬件随机数生成器(TRNG)的质量。如果 TRNG 不可靠,宁可用 Ed25519。
4.3 Ed25519 签名算法:现代、安全、快
Ed25519 是 Edwards 曲线数字签名算法的一种实现。它基于 Curve25519,由 Daniel J. Bernstein 设计。我个人非常喜欢这个算法——它几乎把 RSA 和 ECDSA 的缺点全解决了。
Ed25519 的优势很明显:
- 固定时间执行:没有侧信道攻击风险
- 签名短:只有 64 字节
- 公钥短:只有 32 字节
- 签名快:比 ECDSA 快 2-3 倍
- 抗碰撞:哈希函数内建在算法中
性能对比(签名 1000 次,单位毫秒):
- RSA-2048:约 850 ms
- ECDSA P-256:约 120 ms
- Ed25519:约 45 ms
我在一个高并发签名服务里换掉了 RSA,改用 Ed25519。原来 8 台服务器才能扛住的流量,换完后 2 台就够了。你想想看,这差距有多大。
4.4 三剑客终极对比
下面这张表是我自己整理的选型参考,每次做架构评审都拿出来对照:
| 维度 | RSA-2048 | ECDSA P-256 | Ed25519 |
|---|---|---|---|
| 公钥长度 | 256 B | 32 B | 32 B |
| 签名长度 | 256 B | 64 B | 64 B |
| 签名速度 | 慢 | 快 | 极快 |
| 验签速度 | 快 | 快 | 极快 |
| 侧信道防护 | 需额外实现 | 需额外实现 | 内建 |
| 随机数依赖 | 低 | 高 | 低 |
| 标准化程度 | 极高 | 高 | 中 |
| 适用场景 | 兼容性优先 | 通用场景 | 性能/安全优先 |
4.5 选型建议:我踩过的坑和总结
嗯,这里要注意——没有银弹。每个算法都有自己的脾气。
- 选 RSA:如果你的系统需要兼容 10 年前的设备,或者必须支持加密+签名双用途。但别用 1024 位,至少 2048。
- 选 ECDSA:通用场景,密钥短、速度快。但一定要确保随机数质量,否则私钥可能裸奔。
- 选 Ed25519:新项目首选。性能好、安全、实现简单。我现在的所有新项目都默认用 Ed25519。
我曾经踩过的坑:在一个车联网项目里,我选了 ECDSA P-256。结果某批次设备的随机数生成器有 bug,导致签名可预测。还好在测试阶段发现了,不然后果不堪设想。从那以后,只要条件允许,我优先用 Ed25519。
最后说一句:签名算法只是安全升级的一环。密钥管理、证书链、安全存储同样重要。但算法选对了,地基就稳了。