AES 该用哪个模式:GCM、CBC 与「别自己拼 IV」

密码学 · 2 分钟阅读· 128 次阅读

「用了 AES」不等于安全。CBC 不带认证,攻击者可以翻转比特篡改明文;GCM 自带认证,用错 nonce 则灾难性失效。

选模式的顺序是:优先 AEAD(GCM/ChaCha20-Poly1305),其次 CBC + HMAC。

先说结论

默认 AES-GCM,nonce 绝不复用;老系统用 CBC 必须加 HMAC。

  • GCM 的 nonce 每次加密必须唯一
  • CBC 必须随机 IV,并做 MAC-then-Encrypt 的正确顺序
  • 密钥从 KMS/环境变量取,不硬编码
  • 解密失败不要泄露细节(防 padding oracle)

漏洞是怎么产生的

AEAD 模式把「加密」和「认证」合成一步,能同时防窃听与篡改,是现代默认选择。

GCM 的致命点是 nonce 复用:同一密钥下重复 nonce 会泄露密钥流,进而可伪造。

修复与验证

修复不是改一行代码,而是四件事一起做:

  • 确定是否需要认证(几乎总是需要)
  • 选择 AES-GCM 或 ChaCha20-Poly1305
  • nonce 用随机数或计数器,保证唯一
  • 密钥集中管理,定期轮换
  • 解密失败统一报错,不区分原因

攻击面与检测点

按影响面排序,先修影响最大的:

模式 认证 常见问题
GCM 有 nonce 复用
CBC 无 padding oracle、IV 可预测
CTR 无 可篡改
ChaCha20-Poly1305 有 移动端性能好

AES 该用哪个模式

几个容易踩的坑

下面这些是最常见的错误做法:

  • 固定 IV:相同明文得到相同密文
  • CBC 不加 MAC:可篡改
  • 把密钥写进代码:泄露即全失守
  • 自己实现填充校验:padding oracle 高发

写在最后

加密的正确姿势是「用成熟库 + 正确的模式 + 正确的密钥管理」,三者缺一不可。

安全不是一次加固,是持续的假设:假设输入不可信、假设边界会破、假设有人会看错。

评论 (3)

半
半箱油

修复清单比漏洞描述有用多了,很多文章只讲怎么打不讲怎么防。

白
白帽小林

白名单那条永远是最有效的,正则黑名单迟早绕过。

运
运维老张

建议再补一条:把这类检查加到 CI 里,靠人记必然漏。

发表评论

验证码

提交后需站长审核,通过后才会显示。