首页/安全/加密与证书速查/MAC 与加密的组合方式(MtE/EtM/AEAD)
加密算法基础95 条

MAC 与加密的组合方式(MtE/EtM/AEAD)

认证与加密的三种组合安全性不同:先加密后 MAC(Encrypt-then-MAC)优于 MAC-then-Encrypt;TLS 1.3 直接使用 AEAD 消除组合问题。

加密与证书速查安全更新于 2026-10-13

认证与加密的组合方式

认证与加密有三种组合方式,安全性差异很大。先做认证再加密存在于传统协议的分组套件中,历史攻击面较多;先加密再做认证是推荐做法,验证失败时统一报错;并行计算两种结果的方式可能泄漏明文信息。现代协议直接使用认证加密模式,从根本上消除了组合顺序带来的问题。

基本信息

先认证后加密历史攻击面较多,出现在旧版协议的分组套件
先加密后认证推荐做法,先验后解,错误统一
并行计算认证值可能泄漏明文信息
现代做法直接使用认证加密模式

典型使用场景

  • 兼容性检查:确认服务端是否仍协商旧版分组套件
  • 自研协议设计:选择组合顺序与错误返回策略
  • 排错:确认实现的验证与解密顺序是否正确
  • 迁移规划:把旧套件替换为认证加密模式
  • 代码审计:检查自研代码里拼接与验证的先后关系

检查是否仍协商分组套件

检查是否仍协商分组套件
openssl s_client -connect example.com:443 -tls1_2 -cipher 'ECDHE-RSA-AES128-SHA' </dev/null 2>&1 | grep -i 'cipher\|alert'
openssl ciphers -v 'DEFAULT' | grep -c CBC    # 统计默认集合中的分组套件
# 高版本工具中部分旧套件已默认禁用,需显式指定安全级别才能观察

三种组合方式

方式顺序典型场景要点
先认证后加密先认证再加密旧版协议分组套件历史攻击面较多
先加密后认证先加密再认证安全通道类协议先验再解,错误统一
并行计算两者同时早期安全通道模式认证值可能泄漏明文
旧版协议的分组套件属于先认证后加密家族,是历史攻击的来源;新部署应移交给认证加密模式,存量系统可用扩展特性过渡。

落地建议

  • 实现里先验证认证值再解密,顺序不要写反
  • 认证失败与解密失败返回同一种错误
  • 加密与认证使用独立派生的密钥
  • 新协议默认选用认证加密模式
组合顺序问题的根源在于解密端对失败原因的差异化反馈;统一错误信息并让耗时接近,是最直接的缓解手段,比逐个修补具体攻击更有效。

易错点

  • 先加密后认证的要点是先验证再解密,顺序写反等于没有防护
  • 自研协议加密后拼接认证值却复用同一密钥派生,削弱密钥分离原则
  • 失败时返回不同错误信息或耗时不同,为攻击者提供反馈通道
  • 只升级套件而不检查实现,底层组合顺序问题依然存在
  • 认为旧套件已默认禁用就无需处理,部分客户端仍可能协商成功

数据来源与参考

  • Bellare & Namprempre, Authenticated Encryption(ASIACRYPT 2000)
  • RFC 7366
  • RFC 8446 附录 B
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌