RSA 是什么
RSA 是最常见的非对称加密算法,安全性建立在大整数分解困难之上:公钥可公开,用来加密或验签;私钥自己保存,用来解密或签名。因为运算比对称算法慢很多,它不承担大数据量的加解密,而是用于两件事:TLS 握手中的身份签名(证明服务器持有私钥),以及数字签名/验签。TLS 早年的密钥传输方式已因缺乏前向保密被淘汰,如今 RSA 主要出现在证书签名与握手签名环节。
基本信息
| 密钥长度 | 2048 位为当前底线,3072 位更稳妥,1024 位已不安全 |
|---|---|
| 填充方式 | 加密用 OAEP,签名可用 PSS,避免裸 PKCS#1 v1.5 |
| 速度 | 远慢于对称算法,只用于握手与签名 |
| 规范 | RFC 8017(PKCS#1 v2.2) |
| 生成命令 | OpenSSL 3 推荐 openssl genpkey,旧版为 genrsa |
| 安全强度 | 2048 位 RSA 约等于 112 位对称强度,不能与 AES 位数直接比较 |
典型使用场景
- 为 TLS 服务器证书生成密钥对并提交 CSR
- 对发布物或配置文件做数字签名,分发端验签确认来源与完整性
- SSH 认证中使用 RSA 密钥对(新部署更推荐 Ed25519)
- 离线校验场景:用私钥签名、用公钥验签,双方无需共享密钥
- 理解证书链:根证书与中间证书都用自己的私钥对下级签名
常用操作
常用操作
# 生成私钥(OpenSSL 3 推荐写法)
openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:3072 -out rsa.key
# 从私钥导出公钥
openssl rsa -in rsa.key -pubout -out rsa.pub
# 用私钥签名、用公钥验签
openssl dgst -sha256 -sign rsa.key -out sig.bin data.txt
openssl dgst -sha256 -verify rsa.pub -signature sig.bin data.txt
# 查看密钥长度与结构
openssl rsa -in rsa.key -noout -text | head -20关键要点
| 要点 | 说明 | 实践建议 |
|---|---|---|
| 密钥长度 | 越长越安全但越慢 | 新系统优先 ECC,兼容性要求高时用 RSA 2048+ |
| 填充方案 | PKCS#1 v1.5 有已知攻击面 | 加密用 OAEP,签名用 PSS |
| 前向保密 | RSA 密钥传输无 PFS | 握手只保留 ECDHE + RSA 签名套件 |
| 密钥保护 | 私钥泄露等于身份被冒充 | 私钥权限 600,配合 HSM/密钥库 |
| 混淆点 | RSA 与 AES 强度不可直接比 | 按安全强度等级而非位数比较 |
含 TLS_RSA_* 的密钥传输套件没有前向保密:一旦服务器私钥在未来泄露,攻击者可用它解密此前抓取的会话流量。现代配置应只保留 ECDHE 密钥交换、RSA 仅用于签名的套件。
私钥的权限与备份同样重要:私钥文件按 600 权限保存、走受控备份,并把「泄露后可快速吊销换证」写进流程;通配证书的私钥尤为重要,泄露影响整个一级子域。