保密与完整性,一起考虑

加密负责隐藏内容,而认证用于发现伪造或篡改。AEAD 将这两类需求放在同一个接口中,并支持需要认证但无需保密的关联数据,例如协议版本或消息类型。

seal(key, nonce, plaintext, aad) → ciphertext, tag
open(key, nonce, ciphertext, aad, tag) → plaintext or FAIL

nonce 是协议状态的一部分

以常见的 AES-GCM 和 ChaCha20-Poly1305 用法为例,同一密钥下不能重复使用 nonce。它通常无需保密,却必须遵守方案的唯一性要求。选择计数器时,要考虑并发、进程重启与备份回滚;选择随机生成时,要考虑空间大小、消息数量与碰撞概率。

密钥、nonce 长度和单密钥用量上限应以具体标准及所用密码库的文档为准。不要把示意接口当成通用参数约定。

认证失败必须真的失败

打开密文时,应让成熟的密码库完成验证,并在失败时丢弃结果。未经认证的明文不应进入后续业务逻辑。测试除了正常往返,还应覆盖密文、标签、关联数据被改动,以及使用错误密钥的情况。

认证标签不能替代重放保护。消息序号、窗口与会话状态仍需由协议定义。

延伸阅读