认证加密一次给出两样东西:隐藏内容的密文,以及让接收方能够发现篡改的标签。过去这些功能由分散的部件拼装,糟糕的组合会带来难以察觉的故障。现代构造把组合方式以及它成立的条件一并规定下来。这里的认证一词指的是标签,而不是某个人。

两项保证都只覆盖受保护的报文,不延伸到报文之外的任何东西。

一种构造里的两项保证

加密回答的是:观察者能否读懂这段内容;完整性回答的是:它是否被改动过。隧道两者都需要,因为被改动的内容比读不懂的内容更糟。AEAD 规定如何在一个密钥之下把二者结合起来,同时引入经过认证但不加密的关联数据。接收方一旦校验失败就直接拒绝输入,而不会把被改动的明文当作可接受的结果。

关联数据把可见字段绑定进校验之中。哪些字段被纳入取决于协议,而这并不承诺每一个外层地址都变成秘密:某个字段可以被标签覆盖,同时在链路上仍然可读。

随机数不是细节

密钥与随机数必须被正确管理,而随机数重用的失败方式并不温和。在同一个密钥下重复随机数可能暴露消息之间的关系,并彻底摧毁完整性保证。因此随机数的生成与排序通常由协议而非应用负责。手工围绕隧道拼装构造,正是这份责任丢失的方式。

这是保证成立的条件,而不是实现建议。随意生成随机数的系统并不具备它所宣称的性质。

重放保护是另一份状态

一个有效的旧报文即便标签完好,也可以被重放,因为标签证明的是真实性而不是新鲜度。处理重放需要自己的状态:序号、窗口,以及关于接受什么的规则。这些状态位于协议实现之中,与密码算法的选择无关。加密很强却没有重放保护的隧道,仍然会接受昨天的流量。

两种机制相互配合,却不是同一种机制;其中一个可以正确,而另一个缺席。

标签不会告诉你的事

对端身份由证书或预共享密钥确立,而不是因为某个密码是认证加密的。路由、名称解析以及运营方的日志策略完全位于隧道的密码学边界之外。算法协商成功只说明两端就某个套件达成一致,那讲的是兼容性,而不是任何一侧实现的质量。这些都是各自独立的问题,各有各的证据。

对用户来说,实际的做法是选择一个有人维护、受到支持的协议配置。AEAD 是那套配置的一项性质,而不是围绕隧道手工搭建加密的邀请。

记录协商了哪个套件、重放保护是否启用、对端如何被识别。三件事实,三项不同的保证。

相关文章