RSA-2048 还是 RSA-4096,是 PKI 中最常见的密钥长度问题。RSA-2048 是公开信任证书允许的最小长度,对应 NIST 的 112 位安全强度;RSA-4096 则远高于 128 位。更大的密钥带来的代价体现在签名时间、密钥生成时间以及网络上传输的每一个签名上,因此正确答案取决于密钥签名的频率,以及它需要保持可信多长时间。
概览
| RSA-2048 | RSA-3072 | RSA-4096 | |
|---|---|---|---|
| 经典安全强度(SP 800-57 第 1 部分) | 112 位 | 128 位 | 高于 128 位(表中无此行;7680 位 = 192 位) |
| NIST IR 8547(草案) | 2030年后弃用,2035年后禁用 | 2035年后禁用 | 2035年后禁用 |
| 签名大小 | 256 字节 | 384 字节 | 512 字节 |
| 公钥,SPKI DER | 294 字节 | 422 字节 | 550 字节 |
| 每秒签名次数(OpenSSL 3.6.5) | 约 3,000 | 约 1,045 | 约 470 |
| 每秒验证次数 | 约 114,000 | 约 54,000 | 约 31,500 |
| 密钥生成 | 平均约 26 毫秒 | 约 100 毫秒 | 约 250~280 毫秒,波动很大 |
| CA/Browser Forum 最低要求 | 满足 | 满足 | 满足 |
在 Apple M4 Max 的单个核心上用 openssl speed rsa2048 rsa3072 rsa4096 测得。
安全余量
RSA 的安全性来自用一般数域筛法分解模数的难度,其代价随密钥长度呈亚指数增长,这就是 RSA 密钥必须比椭圆曲线密钥增长得快得多的原因。NIST SP 800-57 第 1 部分把 2048 位 RSA 等同于 112 位安全强度,把 3072 位等同于 128 位,把 7680 位等同于 192 位;表中没有 4096 位这一行,它介于 128 位和 192 位之间。公开分解过的最大 RSA 挑战数为 829 位(RSA-250,2020年),离 2048 位还很远。
更要紧的期限来自量子计算。在大型容错量子计算机上,Shor 算法能在多项式时间内分解这三种长度的密钥;密钥长度翻倍,所需量子比特数大约翻倍,运行时间也只是略有增加,并不会改变结果。Craig Gidney 在2025年估算,用不到一百万个含噪声量子比特,不到一周就能分解 RSA-2048。因此,NIST IR 8547(初始公开草案)为所有长度的 RSA 提议了同一个截止年份——2035年,并因 RSA-2048 的经典安全强度只有 112 位,另外提议在2030年后将其弃用。RSA-4096 延长的是经典安全余量,而不是后量子期限。
性能
私钥运算的开销大致随模数长度的三次方增长,公钥运算则随其平方增长:
openssl speed -seconds 2 rsa2048 rsa3072 rsa4096
sign verify encrypt decrypt sign/s verify/s encr./s decr./s
rsa 2048 bits 0.000334s 0.000009s 0.000009s 0.000339s 2994.9 114178.1 108513.6 2950.3
rsa 3072 bits 0.000957s 0.000019s 0.000019s 0.000965s 1044.7 53948.7 52312.0 1036.7
rsa 4096 bits 0.002117s 0.000032s 0.000032s 0.002121s 472.4 31522.3 30870.7 471.6
对于每次完整握手签名一次的 TLS 服务器,从 2048 位换成 4096 位会让这部分开销变为约六倍。对于每十年只签发几个中间证书的根 CA,这点开销无关紧要。密钥生成也会大幅变慢,因为它要搜索两个大素数:在这台机器上,2048 位平均约 26 毫秒,4096 位则要四分之一秒左右,而且耗时有明显的长尾,这在小型设备上以及反复生成密钥的测试中会成为问题。
由于公钥指数很小(65537),各种长度下的验证开销都很低,这也是 RSA 在被验证数十亿次的证书链中仍占有一席之地的原因。
硬件与协议限制
长度限制更多来自周边环境,而不是 RSA 本身:
- 智能卡和硬件令牌:许多 PIV 卡和较旧的安全令牌只支持 RSA-2048;较新的设备增加了 3072 位和 4096 位。采购硬件前先确认。
- HSM 和云 KMS:三种长度都是标准选项(AWS KMS 提供
RSA_2048、RSA_3072和RSA_4096),但按操作次数计费的定价和吞吐量限制,使 4096 位在大规模使用时明显更贵。 - DNS:4096 位的 DKIM 密钥有 736 个 base64 字符,必须拆分成多个 TXT 字符串;一些 DNS 服务商和旧的解析器处理长记录时会出问题。使用 RSA-4096 的 DNSSEC 区域会产生很大的响应,可能需要改用 TCP。
- 证书链:每张 RSA-4096 证书会带来约 512 字节的签名和 550 字节的密钥,而 ECDSA 只有几百字节,这对资源受限的客户端很重要。
如何选择
- 新的 TLS 服务器证书:首选 ECDSA P-256;如果必须用 RSA,RSA-2048 仍被所有客户端和 CA 接受,但 RSA-3072 能提供2030年之后的安全余量。
- 根 CA 和长期使用的中间 CA:RSA-4096(或 ECDSA P-384);签名开销可以忽略,有效期又长。Let's Encrypt 的 ISRG Root X1 是 RSA-4096,而它的 RSA 中间证书是 RSA-2048。
- JWT 签名(
RS256):RSA-2048 很常见,也是允许的(RFC 7518 要求至少 2048 位),新密钥用 RSA-3072;也可以考虑改用ES256。 - SSH 密钥:优先选 Ed25519;如果用 RSA,至少 3072 位。
- 代码签名和文档签名密钥:RSA-3072 或 4096,根据 CA 提供的选项和签名的预期有效期来定,并加上时间戳。
- 资源受限的硬件:它支持什么就用什么,通常是 RSA-2048,并制定成文的替换计划。
迁移说明
更改 RSA 密钥长度意味着要生成新的密钥对;对于证书,还意味着要申请新证书。
- 按长度清点密钥:证书(
openssl x509 -noout -text)、JWKS(n的长度)、SSH 密钥(ssh-keygen -l)、DKIM 记录和 HSM 密钥句柄。有效期超过2030年的 RSA-2048 密钥最先轮换。 - 就地生成新密钥:
openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:3072,或使用 HSM 的等效功能;不要为了更改长度而导出密钥。 - 新旧密钥并行:在 JWKS 中同时发布两者,并使用不同的
kid值;切换前先添加新的 DKIM 选择器;过渡期间同时提供两个 SSH 主机密钥。 - 用更大的密钥测试各使用方:固定大小的缓冲区、DNS 记录长度限制和嵌入式 TLS 协议栈是常见的出错点。
- 借轮换之机重新考虑算法:如果所有使用方都支持 ECDSA 或 EdDSA,彻底弃用 RSA 通常是更好的投入;而且在2035年之前,后量子签名还需要再轮换一次。