对称加密与非对称加密:原理与实战归纳
加密算法是整个密钥边界系统的基石。说白了,没有加密,密钥保护得再好也没意义。这一章我们聚焦两类最基础的加密方式——对称加密和非对称加密。我会结合项目里踩过的坑,把它们的原理、适用场景、性能差异讲透。
一、对称加密:一把钥匙开一把锁
对称加密的特点是:加密和解密使用同一个密钥。就像你家大门钥匙——同一把钥匙既能锁门也能开门。
1. 工作原理
发送方用密钥 K 加密明文 P,得到密文 C。接收方用同一个密钥 K 解密密文 C,还原回明文 P。整个过程只有一把密钥参与。
核心公式:
- 加密:C = Encrypt(K, P)
- 解密:P = Decrypt(K, C)
2. 常见算法
| 算法 | 密钥长度 | 特点 | 现状 |
|---|---|---|---|
| AES | 128 / 192 / 256 位 | 硬件加速支持好,速度快 | 当今主流标准 |
| DES | 56 位 | 密钥太短,已可暴力破解 | 废弃,别用 |
| 3DES | 112 / 168 位 | 慢,安全性刚好够 | 逐步淘汰中 |
| SM4 | 128 位 | 国密标准,国内合规场景常见 | 国内项目必知 |
我早期做跨境支付项目时,直接用 3DES 加密数据库里的敏感字段。后来做性能压测发现,单条记录加解密耗时超过 2ms,数据量一上来直接拖垮接口响应。换成 AES-256-GCM 后才解决——同样的硬件,性能提升了近 10 倍。
3. 核心短板
- 密钥分发难:每对通信方都得共享同一个密钥。N 个节点两两通信,需要管理 N×(N-1)/2 个密钥。
- 无法抗抵赖:既然双方都知道密钥,发送方可以否认自己发过这条消息。
二、非对称加密:密钥分成两半
非对称加密解决了对称加密的密钥分发问题。它使用一对密钥:公钥公开,私钥自己保管。
1. 工作原理
用公钥加密的数据,只能由对应的私钥解密。反过来,用私钥加密的数据(即数字签名),可以用公钥验证。
核心公式:
- 加密:C = Encrypt(PubKey, P)
- 解密:P = Decrypt(PrivKey, C)
- 签名:Sig = Sign(PrivKey, M)
- 验签:Verify(PubKey, M, Sig) → True/False
2. 常见算法
| 算法 | 典型密钥长度 | 安全性参考 | 备注 |
|---|---|---|---|
| RSA | 2048 / 4096 位 | 依赖大整数分解 | 最广泛,但慢 |
| ECC | 256 位(≈ RSA 3072) | 依赖椭圆曲线离散对数 | 密钥更短,速度更快 |
| SM2 | 256 位 | 国密椭圆曲线 | 国内合规场景 |
| Ed25519 | 256 位 | 高安全,实现不易出错 | 新兴热门 |
我记得有一次做 API 签名方案,团队选了 RSA-2048。上线后发现,每次验签耗时 3-5ms,高峰期 CPU 直接飙到 85%。后来换成 ECDSA(P-256),单次验签降到 0.3ms 以内,CPU 降到 20%。你想想看,同样安全性,性能能差一个数量级。
3. 核心优势与代价
- 优势:公钥随便分发,私钥只在本地。N 个节点只需要 N 对密钥,密钥管理复杂度从 O(n²) 降到 O(n)。
- 代价:计算速度比对称加密慢 100-1000 倍。不适合加密大块数据。
三、对称 vs 非对称:怎么选?
| 维度 | 对称加密 | 非对称加密 |
|---|---|---|
| 密钥数量 | 1 个 | 2 个(公钥+私钥) |
| 速度 | 极快(硬件加速) | 慢(数学运算密集型) |
| 密钥分发 | 困难(需要安全通道) | 容易(公钥可公开) |
| 抗抵赖性 | 不支持 | 支持(数字签名) |
| 典型用途 | 数据加密、批量加密 | 密钥交换、数字签名、身份认证 |
实战中怎么搭配?我一直推荐 「混合加密」方案:
- 用非对称加密协商一个临时会话密钥(比如 TLS 握手阶段)。
- 用对称加密(AES-GCM)加密后续所有数据。
- 用非对称加密的数字签名做身份验证和数据完整性。
我见过不少团队直接用 RSA 加密几 MB 的文件——慢得让人想摔键盘。其实 RSA 不适合干这个活,它的正确用法是加密那个随机的对称密钥,数据本身交给 AES。
四、SVG 知识结构图:加密体系概览
下面这张图梳理了本章的核心知识点。我把它放在这里,方便你对照理解。
五、实战避坑指南
选型建议
- 新项目首选 AES-256-GCM 做对称加密,自带认证标签,防篡改。
- 非对称加密优先考虑 ECC(P-256 / X25519),同等安全强度下性能远好于 RSA。
- 国密合规场景用 SM4 + SM2,不要混用国际算法和国密算法。
曾经踩过的坑
- 不要用 ECB 模式:同样的明文块会加密成同样的密文块,你看密文就能猜出原始数据的模式。有一次我在日志里看到客户 ID 的 ECB 密文,两行一模一样——当时就意识到出事了。
- 不要用 RSA 加密大文件:RSA 有长度限制,密钥长度为 2048 位时,最多加密 245 字节。非要这么做,程序会直接抛异常。
- 随机数别偷懒:对称加密的 IV(初始化向量)必须用密码学安全的随机数生成器。
Math.random()生成的 IV 会直接摧毁安全性。
嗯,到这里对称加密和非对称加密的核心内容就讲完了。理解这两套体系,你后面设计密钥边界系统时,才会知道什么时候用哪种算法、怎么组合、怎么规避常见陷阱。