RSA (Rivest-Shamir-Adleman 算法)
定义
RSA 是 1977 年提出的公钥算法,TLS 用它对证书和握手进行签名,在 TLS 1.3 之前还用它传输会话密钥。
RSA 得名于 Ron Rivest、Adi Shamir 和 Leonard Adleman,是一种公钥密码体制,安全性建立在"分解两个大素数乘积很困难"之上。密钥长度指模数的位数,比如 2048 位。RSA 既能签名也能加密。TLS 中它用于证书签名和握手签名,填充方式有 PKCS#1 v1.5 和 RSA-PSS(TLS 1.3 的握手签名要求 RSA-PSS);在 TLS 1.2 及更早版本中,它还可以直接传输会话秘密。
为什么重要
RSA 仍是部署最广的证书密钥类型,Baseline Requirements 要求 RSA 密钥至少 2048 位。2048 位约相当于 112 位安全强度,3072 位约 128 位。与 ECDSA 相比,RSA 的密钥和签名更大,签名运算更慢。RSA 密钥传输没有前向保密,应当关闭:2017 年的 ROBOT 研究发现,大量服务器仍因此暴露在 Bleichenbacher 式填充预言攻击之下。大规模量子计算机运行 Shor 算法可以破解 RSA,这也是后量子密码迁移的起因。国内云厂商的证书控制台通常也让你在 RSA 和 ECC 之间选择密钥算法。
例子
生成 2048 位 RSA 私钥并据此创建 CSR:
openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:2048 -out example.com.key
openssl req -new -key example.com.key -out example.com.csr -subj "/CN=example.com"
常见误区
- RSA 证书就意味着 RSA 密钥交换。 RSA 证书完全可以配合具备前向保密的 ECDHE-RSA 套件使用,RSA 密钥传输是另一回事,可以单独关闭。
- 想安全就得用 4096 位 RSA。 2048 位是公认的下限。4096 位会拖慢每次握手,ECDSA P-256 能以更低成本提供更高强度。
- RSA 已经被量子计算机破解了。 现有量子计算机远不能分解 RSA-2048,担忧的是未来能力以及今天被录下的数据。