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、高安全需求场景 |
优化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重复(哪怕只重复一次),私钥还是完了。
常用的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慢。
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硬件上的相对性能关系。它不精确,但能帮你快速选型。
2.6 总结:怎么选?
说一千道一万,选哪种算法,还是得看你的场景。
- 兼容性优先: RSA-2048几乎万能,所有系统都支持。但千万别碰RSA-1024了,真不安全。
- 性能与安全平衡: ECDSA P-256 或 Ed25519。如果HSM支持硬件加速,Ed25519速度最快。
- 国内合规: SM2是必选项。别想绕过去。
我记得有一次给一个金融客户做方案,他们既要兼容国外TLS,又要过国密合规检测。最后方案是:HSM里同时预置P-256和SM2密钥对,TLS握手时根据客户端Hello里的密码套件自动选择签名算法。这就是混合部署的思路。