3、签名算法选型:RSA vs ECDSA 对比

签名算法选型,说白了就是给固件选一把「锁」。锁太弱,防不住人;锁太重,开锁慢,影响产线效率。我这些年经手过几十个嵌入式项目,从8位MCU到多核应用处理器,签名算法这块踩过的坑真不少。今天咱们就掰开揉碎聊聊RSA和ECDSA这对老冤家。

3.1 RSA:老牌劲旅,但有点「胖」

RSA诞生于1977年,算力界的常青树。它的安全性基于大整数分解难题——给你两个大质数相乘很容易,但把乘积还原回质数,难。

RSA的核心特点:

  • 公钥短,私钥长:公钥就是n和e,私钥包含d、p、q等。2048位RSA,公钥约256字节,私钥约512字节。
  • 签名慢,验签快:签名用私钥,涉及大数模幂运算;验签用公钥,指数e通常选65537,计算量小很多。
  • 密钥长度「卷」:1024位已被破解,现在最低2048位,安全机构建议3072位。位数一涨,签名体积和计算时间跟着涨。

实际项目中的感受:

我在一个工业网关项目里用过RSA-2048。签名一次大概要30ms(Cortex-A7 @1GHz),验签只要1ms。但固件包从1MB涨到1.5MB,因为签名和证书占了不少空间。OTA升级时,用户抱怨流量用得快。嗯,这就是RSA的代价。

3.2 ECDSA:后起之秀,短小精悍

ECDSA基于椭圆曲线离散对数难题。同样的安全强度,ECDSA的密钥长度只有RSA的十分之一左右。比如256位ECDSA ≈ 3072位RSA。

ECDSA的核心特点:

  • 密钥短,签名短:256位ECDSA,私钥32字节,公钥64字节(未压缩),签名64字节。比RSA小一个数量级。
  • 签名快,验签也快:椭圆曲线运算在硬件加速下非常快。软件实现也比同安全等级的RSA快不少。
  • 曲线选择有讲究:常用曲线有P-256(secp256r1)、P-384、P-521,还有Curve25519(Ed25519)。选错了曲线,安全性可能打折扣。

我的建议:

新项目我基本都推ECDSA。尤其是资源受限的MCU,Flash和RAM都金贵,ECDSA的短签名和短密钥太香了。但要注意,ECDSA的随机数生成必须高质量——随机数重复等于私钥泄露。我曾经排查过一个产线bug,就是随机数种子没初始化好,导致签名可预测。那两天真是头皮发麻。

3.3 RSA vs ECDSA:正面硬刚

咱们直接上对比表,一目了然:

对比维度 RSA-2048 ECDSA-P256
安全强度 112位 128位
公钥长度 256字节 64字节
签名长度 256字节 64字节
签名速度(软件) 慢(约30ms) 快(约5ms)
验签速度(软件) 快(约1ms) 较快(约3ms)
硬件加速支持 广泛(老芯片也有) 逐渐普及(新芯片标配)
抗量子攻击 弱 弱(但比RSA稍好)

你想想看,ECDSA在签名长度和签名速度上完胜,验签稍慢但差距不大。对于固件签名场景——签名在服务器做(算力充足),验签在设备端做(资源受限)——ECDSA的短签名优势更突出。

注意:

ECDSA的验签速度受曲线影响。P-256在Cortex-M4上纯软件验签大约需要10-20ms,而RSA-2048验签只要2-5ms。如果你的设备CPU很弱,又没有硬件加速,RSA验签反而更快。我有个同事在低端MCU上硬上ECDSA,结果启动时间从2秒变成8秒,被客户骂惨了。

3.4 密钥长度选择:不是越长越好

很多人觉得密钥越长越安全,恨不得上RSA-4096或ECDSA-P521。但嵌入式世界里,每多一位都是成本。

密钥长度选择的几个原则:

  • 匹配安全生命周期:产品计划卖5年,选128位安全强度就够了(ECDSA-P256或RSA-3072)。10年以上产品,建议256位(ECDSA-P521)。
  • 考虑签名体积:OTA升级包每多1KB,百万级设备就是1GB流量。ECDSA-P256签名64字节,RSA-4096签名512字节,差了8倍。
  • 硬件加速限制:有些芯片只支持到P-256或RSA-2048的硬件加速。选更高位数的密钥,只能纯软件跑,性能断崖式下跌。

我的经验:

物联网设备我一般推荐ECDSA-P256。安全强度够用,签名短,硬件加速支持好。如果设备是10年以上生命周期(比如电网设备),我会选ECDSA-P384。RSA我只在两种情况下用:一是芯片只有RSA硬件加速,二是需要兼容旧版固件升级流程。

3.5 签名性能与安全权衡

性能和安全的权衡,说白了就是「你愿意为安全花多少资源」。

几个典型场景的权衡:

  • 产线签名(服务器端):性能不是瓶颈,安全第一。用RSA-4096或ECDSA-P521都行。但要注意签名速度——产线每秒要签几百个固件,ECDSA比RSA快5-10倍,能省下不少服务器成本。
  • 设备验签(客户端):这是关键路径。启动时验签慢1秒,用户体验就差1秒。我建议在目标芯片上跑benchmark,选验签最快的方案。
  • 安全启动链:多级启动(ROM→Bootloader→固件),每级都要验签。签名长度影响每级代码大小,验签时间影响启动时间。我见过一个项目,三级启动都用RSA-4096,启动花了15秒,最后被迫砍成两级。

避坑指南:

我曾经在一个项目里选了ECDSA-P256,但没注意芯片的硬件加速只支持P-256的签名,不支持验签。结果验签纯软件跑,每次要50ms。后来换了颗支持完整硬件加速的芯片,验签降到2ms。所以选芯片时,一定要确认硬件加速覆盖签名和验签两个方向。

3.6 硬件加速支持:能省则省

硬件加速不是万能的,但没有硬件加速是万万不能的。尤其是ECDSA,纯软件实现涉及模逆、点乘、双基点乘等复杂运算,在低端MCU上跑起来很吃力。

常见的硬件加速形式:

  • 专用密码协处理器:比如NXP的LPC55xx系列内置PUF和加密引擎,支持RSA和ECDSA硬件加速。
  • CPU指令扩展:ARMv8-M的TrustZone和Cortex-M35P等,提供安全指令集加速密码运算。
  • 独立安全芯片:如ATECC608A,专门做密钥存储和签名验签,主MCU只发指令。

硬件加速带来的收益:

  • ECDSA-P256验签:纯软件50ms → 硬件加速2ms,提升25倍。
  • RSA-2048验签:纯软件5ms → 硬件加速0.5ms,提升10倍。
  • 功耗:硬件加速比纯软件低一个数量级,电池设备尤其重要。

注意:

硬件加速不是「插上就能用」。驱动要调通,API要对接,密钥要安全导入。我见过一个团队,硬件加速模块焊在板子上,但驱动没写好,最后全用软件跑。那叫一个浪费。所以选型时,不光看芯片手册,还要看驱动成熟度和社区支持。

3.7 知识体系总览

下面这张图把签名算法选型的核心逻辑串起来了。你可以把它当作决策参考:

签名算法选型决策流程 签名算法选型 RSA ECDSA 密钥长度:2048/3072/4096位 签名慢 / 验签快 / 签名体积大 硬件加速:广泛支持(老芯片也有) 密钥长度:P-256/P-384/P-521 签名快 / 验签较快 / 签名体积小 硬件加速:新芯片逐渐普及 决策建议:新项目优先ECDSA-P256 例外:芯片只有RSA硬件加速 / 需兼容旧版升级流程 长生命周期产品(10年+)考虑ECDSA-P384或RSA-3072

这张图从根节点「签名算法选型」出发,分叉到RSA和ECDSA两条路,下面列出了各自的密钥长度、性能特征和硬件加速情况。最下面是决策建议——新项目优先ECDSA-P256,但别忘了那两个例外情况。

3.8 小结

签名算法选型没有银弹。RSA成熟、验签快、硬件支持广,但密钥和签名都「胖」。ECDSA短小精悍、签名快,但验签稍慢,对随机数质量要求高。我个人习惯:新项目无脑上ECDSA-P256,除非芯片不支持或者要兼容旧系统。密钥长度够用就好,别盲目追高。硬件加速能省则省,但一定要确认驱动和API的成熟度。