关联数据可验证而不隐藏

RFC 5116的AEAD接口接收密钥、nonce、明文和关联数据,输出密文或失败状态。明文得到保密与认证,关联数据只得到认证而不加密,可用来绑定需要公开的协议版本、序号或路由上下文。

例如公开报头必须让接收方或网络读取,也可能需要防止它被悄悄修改;把相应字节作为关联数据,就能让接收方在解密验证时检查一致性。哪些字段被纳入、如何编码和绑定到消息,由具体协议规定,算法不会自动猜出所有重要上下文。

参考:[1]

验证失败不能当成可用明文

认证解密应返回验证通过的明文或失败,而不是把未通过的部分结果继续当作可信消息处理。能算出某些解密字节,与消息通过完整性检查,是不同状态;业务操作不应先依赖这些字节再事后检查标签。

这种认证也不是公开可验证的数字签名,更不自动决定账号权限。共享密钥下能形成有效消息的参与者,与获准执行某项业务动作的身份之间,还需协议认证和授权关系;AEAD接口本身也不承担防重放服务。

参考:[1]

nonce要求由算法和协议共同承担

对要求同一密钥下nonce唯一的算法,重复加密时复用nonce可破坏安全性。AES-GCM是重要例子;多进程、重启和共享密钥设备要共同避免把同一值再次用于新的加密,nonce也不需要被误当成第二把保密密钥。

额外的误用抗性并不是所有AEAD天然具有的属性。RFC 9771区分相关性质;选用更能容忍某些错误的构造,也不意味着可以无限复用、忽略用量限制或取消接收方重放状态。必须按实际算法的保证和协议用法判断。

参考:[1] [2]