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 的签名体积和计算开销在资源受限设备上是个大问题。

我的习惯:如果芯片有硬件 RSA 加速器,优先用 RSA-2048+SHA-256。没有硬件加速的话,软件实现一次验签可能要几百毫秒到几秒,用户体验很差。

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:比特币用的曲线,嵌入式支持较少。
我曾经踩过的坑:ECDSA 签名过程中需要生成随机数 k。如果 k 值重复或可预测,私钥会直接泄露!索尼 PS3 当年就是因为 k 值固定被破解。所以一定要用硬件真随机数发生器(TRNG)来生成 k,别偷懒用伪随机数。

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 几乎是唯一选择。

注意:Ed25519 的密钥格式和传统 ECDSA 不兼容。如果你的工具链或安全芯片不支持 Ed25519,可能需要额外移植工作。不过现在主流 MCU 厂商(ST、NXP、TI)的新款安全芯片基本都支持了。

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 标准有差异,联调时一定要确认双方用的都是国密标准。

避坑指南:SM2 的 Z 值计算涉及用户标识符 IDA,默认值是 "1234567812345678"。如果通信双方用的 IDA 不一致,验签会失败。我曾经排查过一整天,最后发现是 IDA 长度编码方式不同——一方用了 16 字节,另一方用了 8 字节。

4.5 四种算法横向对比

维度 RSA-2048 ECDSA P-256 Ed25519 SM2
密钥长度(私钥) 256 字节 32 字节 32 字节 32 字节
签名长度 256 字节 64 字节 64 字节 64 字节
签名速度 慢 中 快 中
验签速度 慢 中 快 中
硬件加速支持 广泛 广泛 逐渐普及 国内芯片支持好
合规要求 国际通用 国际通用 国际通用 中国国密
抗量子攻击 弱 弱 弱 弱

4.6 签名算法选型决策树

为了帮你快速决策,我画了一张流程图。你可以根据项目约束条件,沿着箭头找到最合适的算法。

签名算法选型决策树 是否需要国密合规? 是 → SM2 否 → 继续判断 MCU 资源是否受限? 是 → Ed25519 否 → 继续判断 是否有硬件 RSA 加速器? 有 → RSA-2048 无 → ECDSA P-256 说明: • 国密合规项目(政府、金融、关键基础设施)→ 强制使用 SM2 • 资源受限设备(小 RAM、无硬件加速)→ Ed25519 是最优解 • 有硬件 RSA 加速器且无国密要求 → RSA-2048 成熟稳定 • 无硬件加速但资源充足 → ECDSA P-256 是安全与性能的平衡点

4.7 实践建议

最后,我根据实际项目经验,给你几条具体建议:

  1. 新项目首选 Ed25519。除非有国密合规要求或硬件 RSA 加速器已经焊死在板子上,否则 Ed25519 在性能、安全、代码体积上都是最优解。
  2. 国密项目用 SM2,但要做好联调准备。SM2 的工具链、证书格式、ID 管理都比国际算法复杂,建议提前和合作伙伴对齐所有参数。
  3. RSA 只用在有硬件加速的场景。软件 RSA 验签太慢,而且签名体积大,不适合 OTA 升级场景。
  4. ECDSA 注意随机数质量。如果芯片没有 TRNG,可以考虑用 Ed25519 替代,彻底规避随机数风险。
  5. 密钥存储是另一道防线。签名算法再强,私钥被读出来也没用。建议把私钥放在安全芯片或 MPU 的受保护存储区。
一句话总结:RSA 是老兵,ECDSA 是主力,Ed25519 是新锐,SM2 是国标。选型时先看合规要求,再看硬件能力,最后看性能需求。没有银弹,但 Ed25519 最接近。