4、签名算法详解:RSA签名、ECDSA签名、Ed25519签名、SM2国密签名
签名算法,说白了就是给固件贴上一张「防伪标签」。你想想看,设备在升级时怎么知道收到的固件是官方发布的,而不是被黑客篡改过的?靠的就是签名验证。
我这些年经手的项目,从消费级 IoT 到车规级控制器,签名算法基本就这四类:RSA、ECDSA、Ed25519、SM2。每种算法都有自己的脾气,选错了轻则性能拉胯,重则安全翻车。今天咱们把这四种算法掰开揉碎讲清楚。
4.1 RSA 签名——老牌劲旅,但有点「胖」
RSA 应该是大家最熟悉的签名算法了。它的数学基础是大整数分解难题——两个大质数相乘容易,但从乘积反推质数极难。
签名流程:用私钥对固件哈希值做 RSA 加密(实际是模幂运算),生成签名。验签时用公钥解密签名,比对哈希值是否一致。
关键参数:
- 密钥长度:2048 位起步,4096 位更安全。1024 位已被破解,千万别用。
- 签名长度:等于密钥长度。2048 位密钥 → 256 字节签名。
- 哈希算法:通常搭配 SHA-256 或 SHA-384。
我在项目中遇到过一件事:某款 MCU 只有 64KB RAM,跑 RSA-2048 验签时内存直接爆了。后来发现是签名长度 256 字节,加上中间计算结果,把栈空间撑满了。嗯,这里要注意——RSA 的签名体积和计算开销在资源受限设备上是个大问题。
4.2 ECDSA 签名——短小精悍,性能均衡
ECDSA(椭圆曲线数字签名算法)是 RSA 的现代替代方案。它基于椭圆曲线离散对数难题,在相同安全强度下,密钥和签名都比 RSA 短得多。
关键对比:
| 安全强度 | RSA 密钥长度 | ECDSA 密钥长度 | 签名长度 |
|---|---|---|---|
| 80 位 | 1024 位(已不安全) | 160 位 | 40 字节 |
| 128 位 | 3072 位 | 256 位 | 64 字节 |
| 256 位 | 15360 位 | 512 位 | 128 字节 |
看出来了吧?ECDSA 在签名长度上有压倒性优势。128 位安全强度下,ECDSA 签名只有 64 字节,而 RSA 需要 384 字节。
常用曲线:
- secp256r1(P-256):最广泛支持,NIST 标准,几乎所有安全芯片都支持。
- secp384r1(P-384):更高安全等级,适合对安全性要求极高的场景。
- secp256k1:比特币用的曲线,嵌入式支持较少。
4.3 Ed25519 签名——后起之秀,又快又稳
Ed25519 是 Edwards 曲线数字签名算法的一种实现。它属于 EdDSA 家族,由 Daniel J. Bernstein 设计。我个人非常喜欢这个算法,因为它几乎在所有维度上都表现优秀。
核心优势:
- 签名速度快:比 ECDSA 快 2-3 倍,比 RSA 快 10 倍以上。
- 验签速度快:同样碾压 RSA 和 ECDSA。
- 签名长度固定:64 字节,不管安全强度多高都是 64 字节。
- 抗侧信道攻击:算法设计天然抵抗时序攻击和简单功耗分析。
- 无需随机数:签名过程是确定性的,不存在 k 值重复风险。
参数一览:
| 参数 | 值 |
|---|---|
| 曲线 | Curve25519(Edwards 形式) |
| 密钥长度 | 32 字节(256 位) |
| 签名长度 | 64 字节 |
| 安全强度 | 128 位 |
| 哈希算法 | SHA-512(内部使用) |
我建议你在新项目中优先考虑 Ed25519。尤其是那些对启动时间有严格要求的场景——比如汽车电子,冷启动必须在几百毫秒内完成签名验证,Ed25519 几乎是唯一选择。
4.4 SM2 国密签名——合规必选,性能不俗
SM2 是中国国家密码管理局发布的椭圆曲线公钥密码算法标准(GM/T 0003-2012)。如果你做的是国内政府项目、金融系统或关键基础设施,SM2 是强制要求。
技术特点:
- 曲线参数:基于 256 位素域上的椭圆曲线,参数由国家指定。
- 签名长度:64 字节(r 和 s 各 32 字节)。
- 安全强度:128 位,与 ECDSA P-256 相当。
- 算法流程:与 ECDSA 类似,但加入了用户标识符(Z 值)计算,防止签名被跨场景复用。
SM2 签名流程(简化):
1. 计算 Z 值 = Hash(ENTLA || IDA || a || b || xG || yG || xA || yA)
2. 计算 e = Hash(Z || M)
3. 生成随机数 k,计算椭圆曲线点 (x1, y1) = k * G
4. 计算 r = (e + x1) mod n
5. 计算 s = ((1 + dA)^-1 * (k - r * dA)) mod n
6. 签名 = (r, s),各 32 字节
我在做某银行安全网关项目时,客户明确要求必须用 SM2。当时最大的挑战是工具链支持——OpenSSL 1.1.1 才开始原生支持 SM2,很多老版本需要打补丁。嗯,这里要提醒你:SM2 的证书格式和 X.509 标准有差异,联调时一定要确认双方用的都是国密标准。
4.5 四种算法横向对比
| 维度 | RSA-2048 | ECDSA P-256 | Ed25519 | SM2 |
|---|---|---|---|---|
| 密钥长度(私钥) | 256 字节 | 32 字节 | 32 字节 | 32 字节 |
| 签名长度 | 256 字节 | 64 字节 | 64 字节 | 64 字节 |
| 签名速度 | 慢 | 中 | 快 | 中 |
| 验签速度 | 慢 | 中 | 快 | 中 |
| 硬件加速支持 | 广泛 | 广泛 | 逐渐普及 | 国内芯片支持好 |
| 合规要求 | 国际通用 | 国际通用 | 国际通用 | 中国国密 |
| 抗量子攻击 | 弱 | 弱 | 弱 | 弱 |
4.6 签名算法选型决策树
为了帮你快速决策,我画了一张流程图。你可以根据项目约束条件,沿着箭头找到最合适的算法。
4.7 实践建议
最后,我根据实际项目经验,给你几条具体建议:
- 新项目首选 Ed25519。除非有国密合规要求或硬件 RSA 加速器已经焊死在板子上,否则 Ed25519 在性能、安全、代码体积上都是最优解。
- 国密项目用 SM2,但要做好联调准备。SM2 的工具链、证书格式、ID 管理都比国际算法复杂,建议提前和合作伙伴对齐所有参数。
- RSA 只用在有硬件加速的场景。软件 RSA 验签太慢,而且签名体积大,不适合 OTA 升级场景。
- ECDSA 注意随机数质量。如果芯片没有 TRNG,可以考虑用 Ed25519 替代,彻底规避随机数风险。
- 密钥存储是另一道防线。签名算法再强,私钥被读出来也没用。建议把私钥放在安全芯片或 MPU 的受保护存储区。