对称加密是什么
对称加密用同一把密钥(或彼此可推导的密钥)完成加密与解密:速度快、适合大数据量,是真正保护数据流的算法。它的短板在密钥分发——怎么把密钥安全地给到对端;TLS 的做法是用非对称密钥交换协商出一把会话密钥,再交给对称算法加密记录层数据。代表算法是 AES 与 ChaCha20,DES/3DES 已淘汰。
基本信息
| 代表算法 | AES-128/256、ChaCha20-Poly1305 |
|---|---|
| 常见模式 | GCM/CCM 属 AEAD,加密与认证一步完成;CBC 需另配 HMAC |
| 密钥长度 | 128 位或 256 位(AES);ChaCha20 为 256 位 |
| 性能 | 有 AES-NI 时可达数 GB/s |
| 核心难题 | 密钥的分发、存储与轮换 |
典型使用场景
- TLS 记录层数据加密:握手用非对称,数据用对称
- 磁盘与文件加密:LUKS、BitLocker、VeraCrypt
- 备份与归档加密:上传前在客户端加密,云端只存密文
- 数据库敏感字段加密:手机号、身份证号等落地加密
- 隧道与 VPN 载荷加密:IPsec ESP、WireGuard
openssl 加解密演示
openssl 加解密演示
# 生成 32 字节随机密钥并收紧权限
openssl rand -out key.bin 32 && chmod 600 key.bin
# 用 AES-256-GCM 加密(GCM 必须显式给出 IV)
openssl enc -aes-256-gcm -K "$(xxd -p -c 64 key.bin)" -iv "$(openssl rand -hex 12)" -in plain.txt -out cipher.bin
# 解密时 IV 必须与加密时一致,需与密文一起保存
openssl enc -d -aes-256-gcm -K "$(xxd -p -c 64 key.bin)" -iv "$IV" -in cipher.bin -out plain.txt
# 生产建议:直接调用 libsodium / ring / 语言的 AEAD 接口,不要自行拼接分组模式选择
| 模式 | 特性 | 建议 |
|---|---|---|
| GCM | AEAD,加密与认证一体,AES-NI 下极快 | 默认首选 |
| CCM | AEAD,适合功耗受限设备 | IoT 与嵌入式 |
| CBC | 只加密不认证,需另配 HMAC | 仅兼容旧系统 |
| CTR | 流模式,无认证,nonce 复用即失效 | 仅作组件使用 |
| ECB | 相同明文块产生相同密文,泄露结构 | 任何场景都不应使用 |
AEAD 的 nonce 在同一密钥下绝不能重复:GCM 重复 nonce 会让攻击者恢复认证密钥。随机 nonce 要评估碰撞概率,高吞吐场景更稳妥的做法是用计数器管理。
只加密不给完整性,等于把数据暴露在位翻转攻击下:CBC/CTR 裸用会遭受 padding oracle 类攻击,正确姿势是 AEAD 或先加密再对所有密文做 MAC。