2. 对称加密与非对称加密基础
加密这事儿,说白了就是两派天下。
一派是“对称加密”,快、简单、粗暴;另一派是“非对称加密”,慢、安全、优雅。
咱们在做参数配置、决定并发性能的时候,选哪一派,差别非常大。
为什么这么说?我早年踩过坑,后面慢慢聊。
2.1 加密的简单分类
先看一个全局框架,把这两兄弟的关系理清。
核心结论:对称加密搞定“速度”,非对称加密搞定“安全分发”。你在工程化设计时,这两个往往是组合使用的。
2.2 对称加密:快,但钥匙怎么给?
对称加密的原理很简单:加密和解密用的是同一把密钥。
你想想看,就好像你往家里装了一把锁,自己留一把钥匙。你老婆也得有一把同样的钥匙,才能进门。钥匙怎么给她?直接递?万一路上被人复制了呢?
这就是对称加密的痛点。
常见对称算法
| 算法 | 密钥长度 | 分组大小 | 特点 |
|---|---|---|---|
| AES (高级加密标准) | 128/192/256 位 | 128 位 | 当今最主流,硬件加速支持好 |
| DES (数据加密标准) | 56 位 | 64 位 | 已不安全,不再使用 |
| 3DES | 112/168 位 | 64 位 | 兼容老系统,性能差 |
| SM4 (国密) | 128 位 | 128 位 | 中国国家标准,国内合规必选 |
| ChaCha20 | 256 位 | 流密码 | 无硬件加速时比AES快,移动端友好 |
我个人习惯,项目里只要允许,首选 AES-256-GCM。GCM 模式自带认证,能防篡改。嗯,这里要注意:别用 ECB 模式,那是给新手挖的坑。
实战技巧:对称加密速度极快,AES-256 在主流 CPU 上能达到 1GB/s+ 的吞吐。所以大量数据传输的场景,别无脑选非对称。
代码示例:AES-256-GCM 加密/解密
// Node.js 示例,使用 crypto 模块
const crypto = require('crypto');
const secretKey = crypto.randomBytes(32); // 256 位密钥
const iv = crypto.randomBytes(12); // 12 字节 IV
function encrypt(plaintext) {
const cipher = crypto.createCipheriv('aes-256-gcm', secretKey, iv);
let encrypted = cipher.update(plaintext, 'utf8', 'hex');
encrypted += cipher.final('hex');
const authTag = cipher.getAuthTag().toString('hex');
return { encrypted, authTag, iv: iv.toString('hex') };
}
function decrypt(encrypted, authTag, ivHex) {
const decipher = crypto.createDecipheriv(
'aes-256-gcm',
secretKey,
Buffer.from(ivHex, 'hex')
);
decipher.setAuthTag(Buffer.from(authTag, 'hex'));
let decrypted = decipher.update(encrypted, 'hex', 'utf8');
decrypted += decipher.final('utf8');
return decrypted;
}
// 使用
const result = encrypt('Hello, 我是敏感数据');
console.log(result);
// 记得安全保存 secretKey!
避坑提醒:我曾经接手过一个老项目,密钥写死在代码里,然后整个代码库放在 Git 上。我劝你一句:密钥永远不要硬编码。用密钥管理服务(KMS)或者环境变量注入。
2.3 非对称加密:慢,但分发不是问题
非对称加密解决了对称加密的“钥匙分发”难题。
它用了两把钥匙:一把公钥(公开),一把私钥(私密)。公钥加密的数据,只有私钥能解开。你完全可以把公钥贴在公司官网、发在邮件里,都不怕。
不过代价是什么?速度。
常见非对称算法
| 算法 | 密钥长度 | 安全强度(等效对称密钥) | 适用场景 |
|---|---|---|---|
| RSA | 2048 / 4096 位 | 112 / 128 位 | 数字签名、密钥交换 |
| ECC (椭圆曲线) | 256 / 384 位 | 128 / 192 位 | 移动端、IoT、高并发 |
| SM2 (国密) | 256 位 | 128 位 | 国内合规、替代RSA |
| DSA | 1024 / 2048 位 | 80 / 112 位 | 仅签名,不加密(已淘汰) |
为什么说非对称慢?我举个例子:RSA 2048 位加密,每秒钟能处理的请求数,大概只有 AES 的千分之一。你想想看,如果用非对称去加密一个大文件,用户得等多久?
我记得有一次做一个即时通讯系统,最初所有消息都用 RSA 加密,结果服务端 CPU 直接飙到 80%。换成混合加密后,CPU 降到 15%。这就是教训。
非对称的核心机制:公钥与私钥
# OpenSSL 生成 RSA 密钥对
# 生成私钥
openssl genrsa -out private.pem 2048
# 提取公钥
openssl rsa -in private.pem -pubout -out public.pem
# 用公钥加密(只能加密少量数据,通常 ≤ 密钥长度/8 - 11 字节)
echo "session_key_123" | openssl rsautl -encrypt -pubin -inkey public.pem -out enc.bin
# 用私钥解密
openssl rsautl -decrypt -inkey private.pem -in enc.bin
注意:RSA 直接加密的数据量极其有限(2048 位密钥最多加密 245 字节)。所以非对称从来不是用来加密正文的,它只用来加密“对称密钥”或者做签名。
2.4 实战对比:你到底该用哪个?
我把关键维度拉一张表,你一看就明白。
| 对比维度 | 对称加密 | 非对称加密 |
|---|---|---|
| 密钥管理 | 难,需要安全通道分发密钥 | 易,公钥可公开 |
| 加密速度 | 极快(硬件加速后 + 微秒级) | 慢(毫秒级,差3-4个数量级) |
| 数据量限制 | 无限制,适合大体积数据 | 有限制,仅适合小数据 |
| 安全性基础 | 密钥保密性 | 私钥保密性 + 数学难题 |
| 典型用途 | 数据加密传输、静态数据加密 | 密钥交换、数字签名、身份认证 |
| 算法举例 | AES, ChaCha20, SM4 | RSA, ECC, SM2 |
我的建议:别二选一。真正的工程方案是“混合加密”——用非对称加密传输对称密钥,再用对称密钥加密大块数据。HTTPS 的 TLS 握手就是这么干的。
2.5 混合加密:最佳实践
咱们把这个流程串起来,看看混合加密怎么工作:
- 客户端生成一个临时对称密钥(比如 AES 256 位随机数)。
- 客户端用服务器的公钥(RSA或ECC)加密这个临时密钥。
- 服务器收到后,用自己的私钥解密,得到临时对称密钥。
- 双方现在有了一个共享的对称密钥,后面所有通信都用它加密。
这样既解决了密钥分发的安全性,又保证了后续通信的高吞吐。
说白了,非对称加密是“桥梁”,对称加密是“高速公路”。
重要提醒:临时对称密钥必须每次会话都重新生成!我曾经见过有人复用同一个对称密钥加密所有会话,那你的私钥就算再安全,整个系统也等于裸奔。每次握手生成新密钥,这是铁律。
2.6 小结:你得记住什么?
我不会列什么“首先其次再次”,我只说三件事:
- 对称加密:快,但密钥分发麻烦。用在大量数据的加密上。
- 非对称加密:慢,但密钥分发安全。用在加密密钥、签名、认证上。
- 混合加密:取长补短,绝大多数生产系统的默认选择。
下次你做应用加密参数配置的时候,先问自己三个问题:数据量大不大?密钥怎么安全交换?性能瓶颈在哪?答案自然就出来了。