AEAD 是什么
AEAD(Authenticated Encryption with Associated Data,带关联数据的认证加密)指一次操作同时输出密文与认证标签:任何对密文或关联数据的篡改都会让校验失败。关联数据(AAD)参与认证但不加密,适合放协议头、序号、租户标识等需要防篡改但不必保密的内容。GCM、CCM、ChaCha20-Poly1305 与 SM4-GCM 都属于 AEAD。
基本信息
| 核心属性 | 机密性与完整性一次完成,篡改可被检出 |
|---|---|
| AAD | 参与认证、明文传输、不加密 |
| 常见算法 | AES-GCM、AES-CCM、ChaCha20-Poly1305、SM4-GCM |
| nonce 要求 | 同一密钥下唯一,通常 96 位 |
| 标签 | 通常 128 位,可截断但不建议 |
| 失败处理 | 校验失败必须整体丢弃消息,不回显部分结果 |
典型使用场景
- 网络协议:TLS 1.3 只保留 AEAD 套件,IPsec ESP 也大量使用 GCM
- 存储加密:对象与文件加密时需要明确校验完整性
- 数据库字段加密:把主键与租户放进 AAD 防止密文搬移
- 消息通信:即时通信与 MQTT 等协议的消息加密与防篡改
- 自研接口:一次调用即完成加密与校验,减少实现出错概率
TLS 1.3 的三个标准套件
TLS 1.3 的三个标准套件
TLS_AES_128_GCM_SHA256
TLS_AES_256_GCM_SHA384
TLS_CHACHA20_POLY1305_SHA256
# 三者都是 AEAD:GCM 与 ChaCha20-Poly1305 自带认证,无需额外 MACAAD 的正确用法(示意)
AAD 的正确用法(示意)
# AAD 放上下文信息:协议版本、租户标识、消息序号
ct, tag = aead_encrypt(key, nonce, plaintext, aad=header_bytes)
# 解密时必须原样传入同一份 AAD,否则校验失败
plaintext = aead_decrypt(key, nonce, ct, tag, aad=header_bytes)
# 错误示例:把 AAD 当作「额外加密的数据」,或解密时不传 AAD常见 AEAD 对照
| 算法 | 标准 | nonce | 标签 | 典型用途 |
|---|---|---|---|---|
| AES-GCM | NIST SP 800-38D | 96 位 | 128 位 | TLS、IPsec、存储加密 |
| AES-CCM | NIST SP 800-38C | 7-13 字节 | 8 或 16 字节 | 物联网、无线与受限环境 |
| ChaCha20-Poly1305 | RFC 8439 | 96 位 | 128 位 | TLS 1.3、WireGuard、移动端 |
| SM4-GCM | GB/T 38636 相关 | 96 位 | 128 位 | TLCP 与国密网关 |
把 AAD 理解成「追加加密数据」是常见误解:AAD 以明文传输,只提供完整性。它的价值在于把上下文绑定到密文上,例如把租户标识放进 AAD,就能让攻击者无法把某租户的密文搬到另一个租户名下解密。
AEAD 解密失败时应整体丢弃消息,不要回显部分解密结果,也不要对「标签错误」与「格式错误」给出不同错误码或明显不同的耗时。细节只应记录在内部日志中,对外统一返回同一种失败。