密码学基础回顾:对称与非对称加密归纳总结
做加密性能调优,光会调参数可不够。你得先搞清楚手里的工具到底是什么原理。对称加密和非对称加密,说白了就是两种完全不同的“锁”和“钥匙”体系。我遇到过不少开发,把 AES 当成 RSA 用,结果性能崩了还找不到原因。
这一节咱们不搞数学推演,就聊聊这两种加密在实际中怎么选、怎么用、坑在哪。你想想看,如果连加密的类型都分不清,谈何优化成本?
对称加密:又快又省,但钥匙怎么给?
对称加密,加密和解密用同一把密钥。最常见的算法就是 AES(Advanced Encryption Standard)。我自己的项目里,90% 的数据加密都用它——不是因为没别的选,而是 AES 在硬件加速下的吞吐量实在太高了。
核心特点:
- 加密速度快,适合大批量数据
- 密钥长度固定(128、192、256 位)
- 需要在通信双方之间安全传递同一把密钥
- 模式要小心(ECB 千万别用,CTR/GCM 是主流)
我曾经在做一个视频流加密系统时,一开始用了 ECB 模式,结果同一帧画面重复块加密后模式完全暴露。后来换成 GCM 模式,不仅安全还带认证,代价就是额外多计算一次 MAC。嗯,这里要注意,GCM 对随机数(nonce)要求极高,重复 nonce 等于自杀。
对称加密的短板很明显:密钥分发。你想想,如果 A 和 B 要加密通信,他们得先商量好一把密钥吧?这个协商过程要是明文传输,密钥就白费了。怎么办?非对称加密出场。
非对称加密:公钥随便给,私钥自己藏
非对称加密用一对密钥:公钥(公开)和私钥(私有)。你用我的公钥加密数据,只有我能用私钥解开。常见的算法有 RSA、ECC(椭圆曲线)。我个人习惯,新项目优先选 ECC 而不是 RSA,因为同样安全强度下 ECC 密钥短、运算快。
举个实际例子:我维护过一套 KMS 系统,客户端的 HTTPS 证书验证就用 RSA-2048。每次握手都要做一次 RSA 解密,服务器 CPU 占用率直接飙到 40%。后来换成 ECC P-256 曲线,CPU 下降到了 12%。你看,选对算法能省不少钱。
性能对比小贴士:
- RSA 加密快,解密慢(私钥操作很重)
- ECC 签名快,验证也快,但签名生成稍微慢一点
- 千万不要用非对称加密去加密大文件——太慢了,通常用混合加密:非对称加密对称密钥,对称密钥加密数据
对称 vs 非对称:一张表看明白
| 对比维度 | 对称加密(如 AES) | 非对称加密(如 RSA/ECC) |
|---|---|---|
| 密钥数量 | 单密钥 | 一对(公钥 + 私钥) |
| 加密速度 | 极快(硬件加速可达几十 Gbps) | 慢(软件实现通常几百 Kbps) |
| 密钥分发 | 困难——需要安全通道 | 简单——公钥公开即可 |
| 常见算法 | AES, ChaCha20 | RSA, ECDSA, EdDSA |
| 典型用途 | 数据加密、存储加密 | 密钥交换、数字签名 |
这张表你最好记在脑子里。每次做架构决策时,先问问自己:数据量多大?密钥怎么分发?性能要求多高?答案自然就出来了。
混合加密:实战中的黄金组合
其实在实际系统中,很少只用一种。你想想,HTTPS 是怎么工作的?客户端用服务器的公钥加密一个随机生成的对称密钥(AES 密钥),然后双方用这个对称密钥加密后续的所有数据。这就是 混合加密。
# 伪代码示例:混合加密流程
# 1. 客户端预先生成对称密钥 sym_key
sym_key = random_aes_key()
# 2. 用服务器的公钥加密 sym_key
encrypted_sym_key = rsa_encrypt(server_pub_key, sym_key)
# 3. 发送 encrypted_sym_key 给服务器
# 4. 服务器用私钥解密得到 sym_key
sym_key = rsa_decrypt(server_priv_key, encrypted_sym_key)
# 5. 之后用 sym_key 进行 AES-GCM 对称加密通信
ciphertext, tag = aes_gcm_encrypt(sym_key, plaintext)
我在做 KMS 成本优化时,就专门调整了这个混合加密里的对称密钥长度:把 AES-256 降为 AES-128(安全强度足够了),每次加密的运算量直接减半。对于海量密钥轮换的场景,省下的钱相当可观。
避坑指南:我曾经踩过的坑
- RSA 公钥加密长度限制: RSA 一次最多加密(密钥位数/8 - 11)字节的数据。比如 2048 位 RSA 只能加密 245 字节。我当初用 RSA 加密整个 1MB 文件,结果报错还不显示原因,查了一下午。
- ECC 曲线选择:别用 P-192(太弱),也别用 secp256k1(那是为区块链设计的)。普通应用用 NIST P-256 或 Curve25519 就足够了。
- 对称加密模式一定要用 AEAD: 像 GCM、ChaCha20-Poly1305,它们同时提供机密性和完整性认证。只用 CBC+HMAC 容易出实现漏洞。
关键选型建议
归纳一下我的经验法则:
- 存储加密(数据库、文件): 对称加密 + GCM 模式,密钥由 KMS 管理。速度快,且每次加密都自带认证。
- 传输加密(TLS、VPN): 混合加密,握手用 ECDHE 交换对称密钥,后续用 AES-GCM 或 ChaCha20。
- 数字签名: 非对称加密,优先用 EdDSA(Ed25519)或 ECDSA P-256,签名短、验证快。
- 密钥封装(KMS 中加密数据密钥): 用 RSA-OAEP 或 ECIES,注意填充模式要正确。
嗯,最后再唠叨一句:别自己发明算法。我在早期项目里总想着“优化”一下 AES 的轮数,结果被安全审计打回来重写。用标准库、标准模式,比什么都稳。