Cryptology Academy · 课时

安全协议设计原则

将 Abadi-Needham 原则、新鲜性和认证目标应用于协议设计,使协议能够抵抗已知攻击。

第 4 / 4 课13 个步骤

安全协议设计原则 是 CoddyKit 上的免费 Cryptology Academy 课时。 这是第 4 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Cryptology Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Cryptology Academy 课程共包含 4 节课。

Dolev-Yao 对手模型

安全协议设计假设存在一个完全控制网络的对手。Dolev-Yao 模型(1983 年)规定:对手可以拦截、读取、延迟、重放、删除和修改传输中的任何消息。对手可以生成与诚实参与方发送的消息无法区分的消息。对手可以使用已知消息组件组合出新消息。对手无法破解密码学基元(无法在没有密钥的情况下解密,也无法伪造签名)。关键在于,对手的计算能力受到限制——只能进行多项式时间计算——但可以控制所有通信信道。协议安全性意味着,即使面对如此强大的对手,仍能实现认证和保密目标,而唯一依赖的是底层基元的计算困难性。

Abadi-Needham 原则

Abadi 和 Needham(1994 年)将实用的协议设计经验提炼为一组原则。(1) 每条消息都应说明其含义:消息的解释应当自包含,而不应依赖上下文。(2) 协议应明确说明主体采取行动的条件。(3) 如果某个主体的身份很重要,就应在消息中明确说明。(4) 必须明确加密的用途:加密提供保密性,签名提供认证——不要用加密代替签名。(5) 消息应在其机密性受到保护所需的协议层进行加密。这些原则避免了许多 NS 类型的缺陷。

新鲜性:随机数与时间戳

重放攻击是最常见的协议漏洞之一。新鲜性机制确保接收到的消息是最近生成的,而不是从旧会话中重放的。主要有两种方法:(1) 随机数(仅使用一次的数字 ONCE)——一种挑战—响应机制,接收方发送一个随机值,并期望响应中原样返回该值。响应必须包含经过加密或签名的随机数,从而防止旧记录通过挑战。(2) 时间戳——双方都加入当前时间;带有过期时间戳的消息会被拒绝。时间戳要求时钟同步(Kerberos 允许 5 分钟的偏差)。在无法进行时钟同步时,通常首选随机数;时间戳则可以简化无状态验证。

密钥分离:不同用途使用不同密钥

将同一个密码学密钥用于多种用途会产生危险的相互作用。如果密钥 K 同时用于加密和认证,对手可能会将构造的密文输入认证机制,从而提取信息。TLS 1.3 通过 HKDF-Expand-Label 为每个派生密钥使用不同标签,严格避免了这一问题:“c hs traffic”(客户端握手)、“s hs traffic”(服务器握手)、“c ap traffic”(客户端应用)。即使握手密钥遭到泄露,从不同 HKDF 分支派生的应用密钥仍然安全。协议设计必须审查每个密钥是否存在多用途风险,并为不同用途派生不同的密钥。

将身份验证绑定到会话

身份验证凭据必须绑定到使用它们的特定会话。没有这种绑定,在一个会话中获得的凭据可能被重放到另一个会话中。技术包括:(1) 将会话标识符包含在已签名或经 MAC 认证的数据中。(2) 将 DH 握手记录包含在签名中(STS 方法)。(3) 使用 HKDF 派生的会话密钥对身份执行 MAC(SIGMA 方法)。TLS 1.3 Finished 消息:MAC(server_finished_key, transcript_hash)——MAC 覆盖完整的握手记录,因此来自不同会话的 Finished 重放会失败。这种绑定正是阻止早期 Kerberos 和 NS 变体中跨会话攻击的机制。

最小权限与最少信息披露

协议应仅披露其功能所必需的最少信息。只向需要身份信息的对象披露身份。除非确有必要,否则不要包含证书序列号或允许将会话与身份关联起来的标识符。TLS 1.3 会加密服务器证书(不同于证书以明文传输的 TLS 1.2),从而减少被动窃听者能够获取的信息。ESNI(加密 SNI,现称 ECH——加密 ClientHello)会加密服务器名称指示,以隐藏客户端正在连接哪个服务器。最少信息披露也是令牌设计的一项原则:JWT 声明应仅包含授权所需的信息,而不应包含完整的身份记录。

防御降级攻击

版本协商是常见的攻击面:攻击者剥离或修改 ClientHello,迫使双方使用更旧、更弱的协议版本。防御措施包括:(1) 经过身份验证的版本协商——将协商出的版本包含在签名的握手记录中(TLS Finished 消息涵盖包括版本在内的 ClientHello)。(2) 降级哨兵——降级到 TLS 1.2 时,TLS 1.3 会在 ServerHello.Random 中设置魔数字节,使客户端能够检测到降级。(3) 防止版本不兼容——服务器必须拒绝格式错误的 ClientHello,而不能静默回退。(4) SCSV——TLS_FALLBACK_SCSV 向服务器表明客户端正在以较低版本重试,使服务器能够拒绝非法回退。

握手记录承诺与不可塑性

协议消息应从第一次交互开始就被纳入承诺。不可塑性意味着攻击者无法修改密文或签名,并使其在不同上下文中通过验证。AEAD 提供密文不可塑性——任何修改都会使身份验证标签失效。在协议层面,握手记录哈希确保握手末尾的 Finished 交换承诺发送过的每条消息。这可以防止拼接攻击:从两个不同会话中拼接消息,无法为任一会话生成有效的 Finished 值。承诺方案(哈希承诺)将这一性质扩展到要求在公开之前预先承诺的协议流程。

状态机清晰性

复杂协议经常在状态机边界处失败。如果状态转换不明确——消息 3 在消息 2 之前到达时会发生什么?如果收到意外的消息类型又会怎样?——实现可能产生分歧,从而造成攻击者可以利用的不一致。协议规范必须定义:完整的状态机(所有状态和有效转换)、对意外输入的处理方式(返回特定错误或静默忽略)、超时和重传限制,以及会话清理。SSL/TLS 历来受到状态机实现分歧的影响——CVE-2014-0160(Heartbleed)本质上就是一次状态机失败:心跳请求在内存边界未得到适当限制的状态下被处理。

可组合性与模块化协议设计

密码协议很少单独使用。AKE 协议建立会话密钥,随后由应用层协议使用该密钥。如果 AKE 协议和应用协议在设计时彼此独立,且未考虑可组合性,它们之间的交互就可能破坏安全性。通用可组合性(UC)框架(Canetti,2001)为协议组合提供了严格模型:如果一个协议与其他 UC 安全协议任意组合后仍保持安全,那么它就是 UC 安全的。TLS 1.3、Signal 和 Noise 都以实现可组合安全为目标。实践中,应使用信道绑定(导出握手记录哈希),将 AKE 会话与后续的应用身份验证关联起来,从而防止在同一 AKE 协议建立的不同会话之间转发凭据。

常见协议设计反模式

协议设计者反复犯下同类错误。(1) 自行实现密码学:在没有同行评审的情况下实现自定义分组密码、MAC 或密钥派生。(2) 隐式信任:根据网络上下文而不是密码学证明来假定消息来源。(3) 可选安全机制:将加密或身份验证设为可配置,最终不可避免地导致降级。(4) 没有撤销机制的长期令牌:签发生命周期很长且无法撤销的 JWT 或会话密钥。(5) 忽略错误通道:不对错误消息进行身份验证,使攻击者能够注入错误并影响协议行为。(6) 使用加密进行身份验证:如果没有 MAC 或签名,加密数据并不能验证其来源。

协议设计原则测验

根据 Abadi-Needham 原则,当身份具有重要意义时,消息为什么应明确包含发送方的身份?

安全协议设计回顾

安全协议设计应遵循既定原则:Dolev-Yao 对手模型(控制网络的对手)、Abadi-Needham 原则(明确身份、自包含消息)、通过一次性随机数或时间戳保证新鲜性、使用带不同标签的 HKDF 进行密钥隔离、绑定身份验证凭据与会话、最少信息披露、通过握手记录身份验证防止降级、通过 AEAD 和握手记录哈希实现不可塑性、采用定义了错误处理方式的清晰状态机,以及通过 UC 模型安全性证明实现可组合性。违反这些原则,几乎是所有已知协议级密码学漏洞的根源。

免费开始

用 AI 导师学习 Cryptology Academy — 免费

在浏览器中编写并运行真实代码,获得全天候 AI 导师的即时帮助,并在网页或应用中继续学习。

课程
67
课程
261

常见问题解答

「安全协议设计原则」课时是免费的吗?

是的 — 「安全协议设计原则」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Cryptology Academy 课程的其余内容,请升级到 CoddyKit PRO。 Cryptology Academy 课程共包含 4 节课。

「安全协议设计原则」这节课中我会学到什么?

将 Abadi-Needham 原则、新鲜性和认证目标应用于协议设计,使协议能够抵抗已知攻击。 你通过在浏览器中直接运行的动手代码来练习 Cryptology Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Cryptology Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Cryptology Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 4 节课,共 4 节。

「安全协议设计原则」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Cryptology Academy 课中编写并运行代码吗?

能。每节 Cryptology Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. Needham-Schroeder 协议与攻击
  2. 站到站协议(STS)
  3. Noise 协议框架
  4. 安全协议设计原则
← 返回 Cryptology Academy