签名算法详解:RSA、ECDSA、Ed25519、SM2 与选型对比
各位同学,今天我们来聊聊签名算法。说实话,签名算法是固件安全里最核心的一环。你想想看,没有可靠的签名,烧录进去的固件到底是官方发布的,还是被人篡改过的?根本分不清。
我在做嵌入式安全审计时,见过太多因为签名算法选型不当导致的惨案。有的为了省几KB的Flash空间,用了弱签名,结果被破解;有的选了性能太差的算法,导致设备启动要等好几秒。嗯,今天我们就来把这几种主流算法掰开揉碎讲清楚。
核心观点:没有绝对最好的签名算法,只有最适合你场景的签名算法。选型时要在安全性、性能、代码体积、硬件支持之间做权衡。
RSA 签名算法原理
RSA 应该是大家最熟悉的非对称算法了。它的数学基础是大整数分解难题——两个大素数相乘容易,但从乘积反推回两个素数极难。
签名过程是这样的:
- 生成一对密钥:公钥 (n, e) 和私钥 (n, d)
- 签名时,用私钥对哈希值做模幂运算:s = h^d mod n
- 验签时,用公钥计算:h' = s^e mod n,比对 h' 与原始哈希
我个人习惯用 2048 位以上的 RSA 密钥。1024 位的?说实话,现在已经不太安全了。我在一个 IoT 项目里见过用 512 位 RSA 签名的设备,用普通笔记本跑几分钟就破解了——那场面,客户脸都绿了。
经验之谈:RSA 的签名速度比验签慢很多。如果你的设备需要频繁签名(比如 OTA 服务器端),RSA 的私钥操作会成为瓶颈。但验签通常很快,适合资源受限的嵌入式设备。
ECDSA 签名算法原理
ECDSA 基于椭圆曲线离散对数难题。同样的安全强度下,ECDSA 的密钥长度比 RSA 短得多。比如 256 位的 ECDSA 安全性大致相当于 3072 位的 RSA。
ECDSA 签名过程:
- 随机生成一个临时密钥对 (k, R)
- 计算 r = R.x mod n
- 计算 s = k^(-1) * (hash + r * privateKey) mod n
- 签名结果为 (r, s)
这里有个坑——随机数 k 绝对不能重复使用!我曾经审计过一个固件,发现同一台设备两次签名用了相同的 k 值。攻击者可以直接算出私钥。嗯,这就是著名的「索尼 PS3 签名破解事件」的根本原因。
避坑指南:实现 ECDSA 时,一定要确保随机数生成器质量过关。如果硬件没有真随机数发生器,建议用 RFC 6979 的确定性 ECDSA,用私钥+消息哈希推导 k 值,避免随机数问题。
Ed25519 签名算法
Ed25519 是 Edwards 曲线上的签名方案。它比 ECDSA 更快、更安全、实现更简单。我个人非常喜欢这个算法,在很多新项目中都推荐使用。
Ed25519 的优势:
- 固定 32 字节公钥、64 字节签名,没有可变长度
- 签名和验签速度都很快,比同安全级别的 ECDSA 快 2-3 倍
- 没有分支和数组索引依赖秘密数据,天然抗侧信道攻击
- 实现代码量小,适合嵌入式环境
我记得有个项目,MCU 主频只有 48MHz,Flash 剩 16KB。RSA 2048 验签要 800ms,ECDSA 要 300ms,而 Ed25519 只要 40ms。你说选哪个?
注意:Ed25519 不是 NIST 标准,有些行业强制要求使用 NIST 曲线(如某些政府项目)。但在消费电子和工业物联网领域,Ed25519 越来越流行。
国密 SM2 签名算法
SM2 是中国国家密码管理局发布的椭圆曲线公钥密码算法。它基于一条 256 位的素域椭圆曲线,安全性相当于 3072 位 RSA。
SM2 签名流程与 ECDSA 类似,但有一些细节差异:
- 使用了不同的椭圆曲线参数
- 签名过程中加入了用户 ID 作为输入
- 哈希算法使用 SM3(国密哈希)
如果你做的是国内政府项目、金融系统或者关键基础设施,SM2 是强制要求。我在一个电力行业的项目中就遇到过——客户明确要求必须用国密算法,否则过不了等保测评。
实用建议:SM2 的软件实现性能与 ECDSA 相当。如果 MCU 支持硬件国密加速(如某些国产芯片),性能会更好。但要注意,SM2 的生态不如 ECDSA 成熟,工具链支持可能不够完善。
算法选型对比
好了,四种算法都讲完了。我们来做个对比,方便你选型时参考。
| 特性 | RSA 2048 | ECDSA P-256 | Ed25519 | SM2 |
|---|---|---|---|---|
| 密钥长度 | 2048 位 | 256 位 | 256 位 | 256 位 |
| 签名大小 | 256 字节 | 64 字节 | 64 字节 | 64 字节 |
| 验签速度 | 慢 | 中 | 快 | 中 |
| 签名速度 | 慢 | 中 | 快 | 中 |
| 代码体积 | 大 | 中 | 小 | 中 |
| 抗量子攻击 | 弱 | 弱 | 弱 | 弱 |
| 标准化 | 全球通用 | NIST | IETF | 国标 |
| 硬件加速 | 常见 | 常见 | 较少 | 国产芯片支持 |
我的选型建议:
- 通用场景:优先选 Ed25519,性能好、代码小、安全性高
- 合规要求:国内政府项目用 SM2,海外政府项目用 ECDSA P-256
- 兼容性优先:如果已有系统用 RSA,继续用 RSA 2048+,但别再用 1024 位了
- 资源极度受限:Ed25519 是唯一能在 8 位 MCU 上跑得动的选择
重要提醒:所有签名算法都无法抵抗量子攻击。如果你做的是生命周期超过 10 年的设备,建议预留升级到后量子签名算法的接口。我在一个卫星项目中就吃了这个亏——设计时没考虑算法升级,后来想换签名算法,整个 OTA 流程都得重写。
最后说一句,签名算法只是固件安全的一部分。你还要考虑密钥存储、安全启动链、防回滚机制等等。但选对了签名算法,你就已经走对了 80% 的路。
可可精品资料库