AEAD 是干什么的
AEAD(带关联数据的认证加密)把机密性与完整性合成一次操作:输入密钥、nonce、明文和关联数据(AAD),输出密文与认证标签;解密时标签校验失败就整体丢弃,绝不做部分处理。AES-GCM、AES-CCM、ChaCha20-Poly1305 都属于 AEAD。TLS 1.3 强制只使用 AEAD 套件,淘汰了「先加密再单独做 MAC」的旧组合方式。
基本信息
| 全称 | Authenticated Encryption with Associated Data |
|---|---|
| 输入 | 密钥 + nonce + 明文 + AAD |
| 输出 | 密文 + 认证标签(常见 16 字节) |
| 常见算法 | AES-128-GCM、AES-256-GCM、ChaCha20-Poly1305、AES-CCM |
| 典型载体 | TLS 1.3 记录层、QUIC、IPsec ESP、磁盘加密、API 报文保护 |
| 解密失败 | 必须整体丢弃并报错,不得使用已解出的部分明文 |
典型使用场景
- TLS/QUIC 记录层:每条记录独立加密并附标签,篡改立即可见
- IPsec ESP:同时提供加密与完整性保护
- 落盘数据保护:数据库字段或文件加密,防止内容被悄悄改写
- API 报文保护:把请求头放进 AAD,正文加密,头部一改即校验失败
- 安全评审:判断协议是否真的用了 AEAD,而不是自制的加密加校验和
接口与检查
接口与检查
(ct, tag) = AEAD_encrypt(key, nonce, plaintext, aad)
plaintext = AEAD_decrypt(key, nonce, ct, tag, aad)
# 解密时 tag 校验失败必须整体丢弃,不能返回部分明文
# nonce 在同一密钥下必须唯一,重复使用会彻底破坏安全性
# AAD 不加密但参与认证,适合放包序号、协议版本、请求路径等元数据本机套件与性能
本机套件与性能
# 查看 OpenSSL 支持的 AEAD 套件
openssl ciphers -v 'AEAD' | head
# 测本机 AES-GCM 与 ChaCha20-Poly1305 的吞吐
openssl speed -evp aes-128-gcm
openssl speed -evp chacha20-poly1305常见 AEAD 算法对比
| 算法 | 特点 | 适用场景 |
|---|---|---|
| AES-128-GCM | 有 AES-NI 硬件加速时吞吐最高 | 通用服务器与支持 AES-NI 的 CPU |
| AES-256-GCM | 密钥更长,合规口径更宽 | 要求 256 位强度的场景 |
| ChaCha20-Poly1305 | 纯软件实现快,抗缓存时序攻击 | 手机与无 AES 加速的设备 |
| AES-CCM | 适合受限硬件,需两遍处理 | 物联网、无线链路加密 |
服务端同时提供 AES-GCM 与 ChaCha20-Poly1305,让客户端按自身硬件能力选择,是兼容移动端与老设备的常规做法。
解密失败时不要为了「容错」跳过标签校验或返回已解出的部分数据,这正是 Padding Oracle 一类攻击的入口。