非对称加密到底解决什么问题
对称加密快,但双方必须先共享密钥——这个“先有鸡还是先有蛋”的问题由非对称加密解决:公钥可以公开,私钥自己保管。但它不能用来加密大文件:RSA 一次只能加密比模数略短的数据,且速度比 AES 慢几个数量级。
密钥长度对照
| 安全强度 | RSA | ECC |
|---|---|---|
| 约 112 位 | 2048 位 | 224 位 |
| 约 128 位 | 3072 位 | 256 位(P-256) |
| 约 192 位 | 7680 位 | 384 位 |
同等安全强度下,ECC 的密钥与签名都短得多,握手更快、报文更小,这也是现代 TLS 普遍使用 ECDHE 的原因。RSA 的优势在于兼容性与生态成熟度,以及部分老系统的支持。
加密与签名的分工
- 加密(只有对方能读):用对方的公钥加密,对方用私钥解密;
- 签名(证明是你发的、且未被改动):用自己的私钥签名,任何人用你的公钥验证;
- 混合加密(实际常见做法):用非对称算法交换/封装一个临时对称密钥,再用 AES 加密数据。HTTPS 就是这套流程。
四个常见误用
- 用 RSA 直接加密大文件:应改用混合加密(RSA-OAEP 封装 AES 密钥);
- 裸 RSA(PKCS#1 v1.5)加密:存在填充攻击风险,应使用 OAEP;
- 把公钥当机密:公钥本就公开,需要保护的是私钥;
- 缺少完整性校验:只加密不签名/不认证,密文被篡改也察觉不到。
常见问题
ECC 会取代 RSA 吗?在新系统中基本是趋势,但存量系统与合规要求可能仍指定 RSA。密钥要多久轮换一次?取决于用途与暴露程度:长期签名密钥可用 1–2 年,会话密钥则应每次会话更换。
典型场景里它到底做什么
| 场景 | 用到的能力 | 原因 |
|---|---|---|
| HTTPS 握手 | 签名 + 密钥交换 | 证书证明身份,ECDHE 协商会话密钥 |
| 代码 / 软件包签名 | 签名 | 任何人用公钥即可验证来源与完整性 |
| SSH 登录 | 签名 | 私钥留在本地,服务器只保存公钥 |
| 加密邮件 | 混合加密 | 正文用对称密钥加密,非对称只保护这把密钥 |
| 大文件传输 | 混合加密 | 绝不直接用 RSA 加密数据本身 |
密钥保管与轮换
- 私钥不进代码仓库:放在密钥管理服务或受限访问的密钥文件中,并严格控制读取权限;
- 按用途分开密钥:签名与加密使用不同的密钥对,降低一次泄露的影响范围;
- 设定轮换周期:长期签名密钥 1–2 年轮换,会话密钥每次会话更换;一旦疑似泄露,立即吊销并重新签发证书;
- 吊销要能被感知:对外发布的公钥应配合吊销列表或 OCSP,否则验证方无法知道密钥已失效。
实战案例:三个非对称加密的误用
- “用私钥加密当签名”:方向搞反。加密是公钥加密、私钥解密;签名是私钥签名、公钥验证。
- “用 RSA 直接加密大文件”:非对称慢且有长度限制,应用混合加密:RSA 保护对称密钥,AES 加密数据。
- “公钥私钥混放一处”:私钥必须离线、独立保存,并与公钥和密文分开;泄露即身份失守。
常见问题(FAQ)
密钥选多长?RSA 至少 2048 位,ECC/SM2 使用标准曲线即可。能跨软件使用吗?导出标准 PEM 一般可用,注意格式与算法匹配。加密和签名能一起用吗?可以,通常先签名后加密。私钥丢了怎么办?无法恢复,只能重新生成并更换公钥。
密钥长度等价表
- 等价强度:RSA 2048 ≈ ECC 224–256;RSA 3072 ≈ ECC 256;RSA 15360 ≈ ECC 521;
- 密钥与签名体积:ECC 256 位密钥仅 32 字节,RSA 2048 为 256 字节,证书与握手数据因此小一个数量级;
- 签名速度:ECC 签名更快、验签相当;RSA 验签快而签名慢,选型要看哪一侧是瓶颈;
- 兼容性:极老的客户端可能只支持 RSA,若必须兼容,可在证书中同时部署 ECC 与 RSA 两套。