2. 常用签名算法:RSA、ECDSA、EdDSA、SM2

签名算法是HSM的核心业务。你想想看,不管你是做TLS握手、代码签名,还是区块链交易,最终都要落到某个算法上。不同的算法,对HSM的吞吐量影响差别巨大。今天我们就来聊聊最常见的四种。

我个人习惯把签名算法分成两大类:数学运算型和曲线运算型。RSA属于前者,剩余三个都属于后者。分清楚这个,后面优化思路就清晰了。

2.1 RSA —— 老当益壮,但也是“吃计算”大户

RSA大家都熟。它的安全性基于大整数分解的困难性。密钥越长,越安全,但计算开销也越大。

它怎么工作?
签名时,私钥做模幂运算。验签时,公钥也做模幂运算。模幂运算说白了就是大数乘法和取模的重复。1024位的RSA可能眨眼就做完了,2048位就要多花几倍时间,4096位…嗯,我建议你压测前先算算硬件预算。

密钥长度 相对签名耗时(基准:RSA-2048) 典型应用场景
RSA-1024 约 0.3x 老旧系统兼容,建议尽快升级
RSA-2048 1.0x 当前主流,TLS证书、代码签名
RSA-4096 约 3-5x 根CA、高安全需求场景
我曾经踩过这个坑:在一台老的PCIe HSM上,我把所有密钥都配成了4096位。结果业务方反馈签名延迟暴涨。一查才发现,该HSM的硬件加速单元对4096位的模幂运算只做了部分优化,吞吐量直接砍到原来的1/4。后来我把根证书用4096位,下级证书用2048位,问题才解决。

优化RSA签名,核心就是减少模幂运算的指数长度。比如用CRT(中国剩余定理)优化私钥运算,签名速度能提升近4倍。大部分现代HSM默认就支持CRT,但如果你用的还是老设备,建议确认一下。

2.2 ECDSA —— 短密钥、高性能,但要注意熵源

ECDSA是椭圆曲线签名算法。它的优势很明显:同样安全强度下,密钥长度比RSA短得多。

举个例子:ECC-256的安全强度大概相当于RSA-3072。但ECC-256的密钥只有256位,RSA-3072有3072位。这就意味着,ECC在芯片上的运算、存储、传输开销都小很多。

但ECDSA有个“怪癖”——它依赖随机数k。每次签名都要生成一个新鲜的、无偏的随机数。如果k泄露,私钥就完了。如果k重复(哪怕只重复一次),私钥还是完了。

我建议:在做ECDSA压测时,一定要关注HSM的随机数生成器(TRNG/DRBG)的性能。有些低端HSM的随机数生成是瓶颈,签名本身很快,但等随机数反而要排队。压测结果会很“难看”。

常用的ECC曲线有:

  • NIST P-256 (secp256r1): 最通用,TLS、JWT、区块链都在用。
  • P-384: 安全余量更高,但计算量也更大。
  • P-521: 政府级应用,性能开销较大。

2.3 EdDSA —— 我个人的“心头好”

EdDSA是Edwards曲线数字签名算法,最出名的实现是Ed25519。为什么说它好?因为它几乎解决了ECDSA的所有痛点。

  • 确定性签名: 不需要随机数,签名结果完全由消息和私钥决定。既安全又稳定。
  • 抗侧信道: 执行时间不依赖输入,天然抵抗时序攻击。
  • 速度快: Ed25519的签名和验签速度,通常比NIST P-256快上不少。

不过要注意,EdDSA基于的曲线是扭曲爱德华兹曲线(和蒙哥马利曲线是双有理等价)。如果HSM硬件只支持Weierstrass曲线(传统ECC那种),那么跑EdDSA就必须走纯软件实现,速度反而可能比NIST P-256慢。

一个小技巧:有些现代HSM支持Ed25519硬件加速。如果你在做高性能签名服务(比如PKI、V2X车联网),优先考虑支持Ed25519的硬件。吞吐量真的能拉开一个数量级。

2.4 SM2 —— 国密标准,我们的“主场”

SM2是国家密码管理局发布的椭圆曲线公钥密码算法标准。它本质上也是一种ECC,使用一条256位的素域椭圆曲线。

SM2和NIST P-256的对比:

特性 SM2 NIST P-256
曲线参数 国密局指定素数 p 和系数 a,b FIPS 186-4 标准参数
密钥长度 256 位 256 位
签名方案 SM2 签名算法(类ECSDA,但不同) ECDSA
密钥交换 SM2 密钥交换协议 ECDH
国内合规 必须(政务、金融、密码法等) 可用,但部分场景不推荐

做压测时要特别注意:SM2的签名流程和ECDSA不完全一样。SM2需要先计算ZA(用户标识的杂凑值),再把ZA拼到消息后面一起做哈希。多这一步运算量不大,但如果HSM的CPU比较弱,或者软件栈没优化,会带来几微秒的额外延迟。可别小看这几微秒,压测跑几十万次,差距就出来了。

2.5 四种算法性能概览

下面这张图,是我归纳的四种算法在典型HSM硬件上的相对性能关系。它不精确,但能帮你快速选型。

四种签名算法性能与安全强度概览 性能(相对值) 低 高 RSA-2048 高性能,密钥长 ECDSA P-256 中等性能,安全 Ed25519 高性能,安全 SM2 中等性能,合规 安全强度(低 → 高) 💡 说明: • 纵轴表示相对性能(签名速度),横轴表示安全强度(同等破解难度)。 • 本图为定性比较,具体数值取决于HSM硬件型号、密钥长度和实现优化程度。

2.6 总结:怎么选?

说一千道一万,选哪种算法,还是得看你的场景。

  • 兼容性优先: RSA-2048几乎万能,所有系统都支持。但千万别碰RSA-1024了,真不安全。
  • 性能与安全平衡: ECDSA P-256 或 Ed25519。如果HSM支持硬件加速,Ed25519速度最快。
  • 国内合规: SM2是必选项。别想绕过去。

我记得有一次给一个金融客户做方案,他们既要兼容国外TLS,又要过国密合规检测。最后方案是:HSM里同时预置P-256和SM2密钥对,TLS握手时根据客户端Hello里的密码套件自动选择签名算法。这就是混合部署的思路。