认证加密(Authenticated Encryption)是同时提供机密性和完整性校验的加密机制;AEAD 还允许把不加密但必须防篡改的关联数据一起纳入认证。
核心问题
单纯 对称加密 只让密文不可读,不一定能阻止攻击者修改密文。认证加密解决的是“接收方如何在解密前确认密文和关键元数据没有被篡改”的问题。
核心机制
AEAD 的抽象接口可以写成:
其中 K 是密钥,N 是 nonce,A 是关联数据,P 是明文,C 是密文,T 是认证标签。解密时如果标签验证失败,必须拒绝输出明文。
常见 AEAD 方案包括 AES-GCM、ChaCha20-Poly1305、AES-CCM。关联数据常用于保护协议版本、消息序号、发送方身份、Header 或文件元数据。
工程用途
- 网络协议记录层:TLS、QUIC、VPN 等用 AEAD 保护每条记录或数据包。
- 应用消息加密:保护消息体,同时认证消息类型、用户 ID、时间戳等元数据。
- 存储加密:对象、日志、配置密文和数据库字段加密。
- 混合加密 的数据层:对称数据密钥通常配合 AEAD 使用。
边界与常见坑
- 认证加密不等于身份认证:它证明消息来自持有同一密钥的一方,不自动证明现实身份。
- nonce 唯一性是硬约束:很多 AEAD 在同一密钥下重复 nonce 会严重破坏安全性。
- 验证失败不能继续用明文:认证标签失败时必须整体拒绝,不能“尽量解密”。
- 关联数据必须一致:加密和解密时的
A不一致会导致验证失败。 - 标签不要随意截断:过短标签会提高伪造成功概率。
- 错误信息要收敛:不要通过不同错误暴露 padding、tag 或字段解析差异。