安全协议设计与分析 ------ 课程笔记
课程:安全协议设计与分析
学院:广州大学 网络空间安全学院
授课教师:王宁 副教授
教材参考:《安全协议分析与设计》(卫剑钒、陈钟)、《安全协议设计与分析》(张文政)
目录
- 课程概述与背景
- 安全协议基本概念
- 安全协议的安全性质与机制
- 安全协议的形式化描述与基础示例
- 对安全协议的攻击
- 安全协议设计目标
- 安全协议设计原则
- 安全协议设计方法
- [DoS 攻击与防御策略](#DoS 攻击与防御策略)
1. 课程概述与背景
1.1 课程目标
- 掌握常见的安全协议类别、威胁模型、形式化分析方法;
- 熟悉经典安全协议的安全问题以及攻击方法;
- 掌握安全协议的设计原则,理解安全协议理论与实践中存在的鸿沟;
- 认识 TCP/IP 协议的原理、面临的安全问题,以及与安全协议的关系;
- 掌握安全认证、密钥建立类安全协议的基本原理、设计思想、安全威胁,复现典型攻击方法;
- 掌握当前流行的安全协议基本原理和安全性分析方法。
1.2 授课计划概览
| 章节 | 内容 | 学时 |
|---|---|---|
| 第一章 | 安全协议概论(问题背景、基本概念、设计目标与原则) | 6 |
| 第二章 | 安全协议基础(密码算法基础、安全多方计算、零知识证明) | 8 |
| 第三章 | 安全协议及其典型攻击(密钥交换、安全认证协议分析) | 4 |
| 第四章 | 实用安全协议(IPsec、TLS/SSL、匿名通信协议) | 8 |
| 第五章 | 安全协议分析方法 | 2 |
| 第六章 | 安全协议研讨和综合实训 | 4 |
1.3 计算机网络面临的安全威胁
计算机网络通信面临的四种基本威胁(按攻击方式分为被动攻击与主动攻击):
计算机网络威胁
│
┌───────────────┴───────────────┐
被动攻击 主动攻击
(难以检测,可防范) (可检测,难防范)
│ │
┌─────────┼─────────┐ ┌───────────┼───────────┐
截获 流量分析 中断/阻断 篡改 伪造 重放
(窃听) (通信模式分析) (DoS) (修改数据) (假数据) (重发数据)
被动攻击
- 窃听/截获:从网络上窃听他人的通信内容;包括搭线窃听、电磁泄露捕获、信息流分析等。
- 流量分析:即使内容加密,攻击者仍可通过分析通信模式(谁和谁通信、通信频率、数据量)获取情报。
- 特点:非常难以检测,但可以通过加密等手段防范。
主动攻击
- 阻断攻击:在不破坏物理线路的前提下,通过干扰、连接配置等方式阻止通信各方之间的数据交换。
- 篡改攻击:非法读取数据后进行篡改,使通信用户无法获得真实信息。
- 伪造攻击:攻击者伪造数据包发给通信各方,导致信息系统无法正常工作或数据错误。
- 重放攻击:攻击者将窃听到的数据包再度发送给接收方,导致接收方信息系统异常。
- 拒绝服务攻击 (DoS):利用协议或系统缺陷,耗尽服务方资源使其无法向授权用户提供服务。
1.4 互联网安全与隐私问题
一个经典论断:"On the Internet, nobody knows you're a dog."(1993 年《纽约客》漫画)------但 20 多年后,元数据分析已经能够精确推断用户身份和行为(甚至能判断出是"褐色的拉布拉多犬")。
- 网络通信可能泄露:通信关系、通信内容、位置信息;
- HTTPS 仅能保护传输的内容信息,无法隐藏通信关系;
- 匿名网络(如 Tor)试图解决这一问题,但自身也存在安全漏洞(如链路重构、Cookie 窃取、流量整形等攻击手段)。
2. 安全协议基本概念
2.1 计算机安全通信的层次结构
安全通信建立在分层体系之上,从上到下依次为:
┌─────────────────────────────────────┐
│ 建筑设施 → 实现层 (Implementation) │ HTTPS, PGP, Tor...
├─────────────────────────────────────┤
│ 设计图纸 → 协议与策略层 │ SSL/TLS, IPsec, 访问控制...
│ (Protocols & Policies) │
├─────────────────────────────────────┤
│ 建筑材料 → 密码原语层 │ RSA, DSS, SHA-1...
│ (Cryptographic Primitives)│
├─────────────────────────────────────┤
│ 地基 → 理论基础层 │ 算法数论、计算复杂性
└─────────────────────────────────────┘
这与 TCP/IP 协议栈的对应关系:
| TCP/IP 层 | 安全方案 | 典型协议 |
|---|---|---|
| 应用层 | 应用层安全 | HTTPS, DNSSEC, PGP, Tor/I2P |
| 传输层 | 传输层安全 | SSL/TLS(嵌入 TCP 之上) |
| 网络层 | 网络层安全 | IPsec(嵌入 IP 层) |
| 网络接口层 | --- | ARP/RARP(无内置安全) |
关键理解:安全协议可在不同层次实现,各有侧重:
- 网络层安全 (IPsec):对所有上层应用透明,保护主机到主机的通信;
- 传输层安全 (SSL/TLS):保护应用到应用的通信,对应用开发者友好;
- 应用层安全 (HTTPS/PGP/Tor):最灵活,可按需提供细粒度保护,但需要每个应用单独实现。
2.2 安全协议的定义
安全协议(密码协议):以密码学为基础的消息交换协议,目的是在网络环境中提供各种安全服务。
三个核心要素:
- 两个或多个通信主体;
- 通信信道位于非受控的网络环境(不安全);
- 基于密码学算法实现安全通信。
协议 vs 安全协议:协议是两个或以上参与者为完成特定任务的一系列步骤;安全协议是在此基础上引入密码学机制来保障安全。
2.3 协议运行环境中的角色
| 角色 | 说明 |
|---|---|
| 参与者 (Participant) | 可能是完全信任的人,也可能是攻击者或完全不信任的人 |
| 攻击者/敌手 (Attacker/Adversary) | 企图破坏协议安全性和正确性的人;可能是合法参与者、外部实体或两者结合;可能是单个实体或合谋的多个实体 |
| 可信第三方 (Trusted Third Party, TTP) | 被通信双方共同信任的实体,如 CA(证书权威机构) |
2.4 安全协议的常见类型
- 密钥交换协议:完成会话密钥的建立,基于对称密码体制或非对称密码体制。
- 认证协议 :
- 数据来源认证:保证数据完整性(非授权改变数据 = 改变数据来源);
- 实体认证:证实用户身份,防止假冒攻击。
- 电子商务协议:保证交易公平性,双方都不能通过损害对方利益来获利。
- 安全多方计算协议:分布式环境中各参与方共同安全执行计算任务,保证正确性和各参与方私有输入的秘密性。
3. 安全协议的安全性质与机制
3.1 四大安全性质
| 性质 | 含义 |
|---|---|
| 机密性 (Confidentiality) | 保护机密信息不被未授权个人/实体读取和使用 |
| 完整性 (Integrity) | 保护信息不被未授权者非法纂改(修改、复制、插入、删除) |
| 认证性 (Authentication) | 对等实体鉴别------证实对方身份的真实性;数据源鉴别------对数据单元的来源提供确认 |
| 不可否认性 (Non-repudiation) | 防止通信实体事后否认曾参与通信(包括发送方否认发送和接收方否认接收) |
3.2 五大安全机制
安全性质依赖以下机制来实现:
安全机制
│
┌───┬───┼───┬───┐
▼ ▼ ▼ ▼ ▼
加密 数字 数据 鉴别 公证
签名 完整性 交换 机制
(1) 加密机制
- 可逆加密:对称加密(如 AES)、非对称加密(如 RSA);
- 不可逆加密:散列函数(如 SHA-256),可使用或不使用密钥。
(2) 数字签名机制
- 采用非对称密钥体制:私钥签名,公钥验证;
- 具备可证实性、不可否认性、不可伪造性、不可重用性;
- 是解决通信双方可能发生争议(否认、冒充、伪造、篡改)的有效方法。
(3) 数据完整性机制
- 数据单元完整性:判断单个数据单元是否被篡改;
- 数据单元序列完整性:要求数据编号连续性和时间标记正确性,防止假冒、丢失、重发、插入或修改。
(4) 鉴别交换机制
- 以交换信息的方式确认实体身份,实现同级之间的身份认证;
- 如果鉴别结果为否定,会导致连接拒绝/终止,或在安全审计跟踪中增加记录。
(5) 公证机制
- 第三方公证人(如 CA)参与数字签名、加密和完整性机制;
- 基于通信双方对第三方的绝对信任,为通信数据的完整性、原发、时间和目的地等性质提供保证。
4. 安全协议的形式化描述与基础示例
4.1 形式化描述约定
| 符号 | 含义 |
|---|---|
| M s g n Msg_n Msgn | 协议的第 n n n 条消息 |
| A → B A \rightarrow B A→B | 消息从 A 发往 B |
| P K a , P K b PK_a, PK_b PKa,PKb 或 K a , K b K_a, K_b Ka,Kb | 相应主体的公钥 |
| S K a , S K b SK_a, SK_b SKa,SKb 或 K a − 1 , K b − 1 K_a^{-1}, K_b^{-1} Ka−1,Kb−1 | 相应主体的私钥 |
| K a b K_{ab} Kab | A 和 B 之间的共享密钥 |
| { x } K \{x\}_K {x}K | 用密钥 K K K 对 x x x 加密(私钥加密 = 签名) |
| T T T | 时间戳 (Timestamp) |
| N N N | Nonce(随机数/"现时",用于检测新鲜性) |
4.2 从简单协议到安全协议的演进
第一步:明文通信(不安全)
A → B : M
- 消息 M M M 可能被攻击者窃听或拦截。
第二步:引入加密
A → B : {M}K_ab
- 消息内容被保护,但协议仍然不安全(无法防御重放攻击)。
第三步:引入 Nonce 防御重放攻击
1. A → B : A
2. B → A : {Na}K_ab
3. A → B : {Na + 1}K_ab, {Pay Elvis €5}K_ab
- N a Na Na 是 B 生成的随机数(Nonce),A 必须返回 N a + 1 Na+1 Na+1 证明自己收到了 N a Na Na;
- 即使在 Nonce 方案下,仍存在复杂重放攻击------攻击者可以多轮运行协议并组合不同轮次的消息。
Nonce 的本质:一个新鲜的、不可预测的随机值,每次协议运行都不同,从而防止攻击者直接重放旧消息。
4.3 攻击者能力模型
攻击者可以:
- 窃听网络上的消息;
- 破解已知密钥加密的消息;
- 构造新的值(Nonce、密钥等);
- 拦截、篡改、重放消息;
- 联合以上多种方法构造新消息。
5. 对安全协议的攻击
5.1 攻击类型总览
协议攻击类型
│
┌───┬───┬───┬───┼───┬───┬───┬───┐
▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼
窃听 篡改 重放 反射 DoS 类型 密码 证书 协议
攻击 分析 操作 交互
5.2 重放攻击 (Replay Attack)
攻击者将之前协议运行中的消息(或部分消息)插入到当前运行的协议中。
示例:
1. A → B : { Pay Eve €5 }K_ab // A 发送合法转账
2. E → B : { Pay Eve €5 }K_ab // 攻击者 E 重放,B 再次转账
防御:使用 Nonce 或时间戳保证消息的新鲜性。
5.3 反射攻击 (Reflection Attack)
消息被重放送回给消息的发送方。
示例------存在缺陷的相互认证协议:
1. A → B : {Na}K
2. B → A : Na, {Nb}K
3. A → B : Nb
攻击过程 (攻击者 E ( B ) E(B) E(B) 冒充 B):
| 连接 1 (A ↔ E(B)) | 连接 2 (E(B) ↔ A) |
|---|---|
| 1. A → E(B) : {Na1}K | |
| 1'. E(B) → A : {Na1}K | |
| 2'. A → E(B) : Na1, {Na2}K | |
| 2. E(B) → A : Na1, {Na2}K | |
| 3. A → E(B) : Na2 | |
| 3'. E(B) → A : Na2 |
攻击者利用 A 作为"预言机",让 A 自己解密自己的 Nonce,从而成功认证。根本原因:消息 2 没有标识发送者身份。
5.4 类型攻击 (Type Flaw/Confusion Attack)
- 用户接收到的信息都是二进制串,无法从格式上判断消息的类型;
- 攻击者用一条消息替换另一条消息,接收者按错误的方式解释接收到的位序列,但仍认为消息有效;
- 常发生在协议消息的字段结构相似或具有反对称性时。
根源:缺乏明确的类型标签和消息格式区分。
5.5 拒绝服务攻击 (DoS/DDoS)
通过耗尽诚实主体资源使之无法有效运行协议。分为:
- 带宽消耗型:大量消息占用网络带宽;
- 资源消耗型:大量请求占用计算/内存资源。
SYN-Flooding 攻击
攻击者伪造源 IP 地址发送大量 SYN 请求,服务器回复 SYN-ACK 后等待 ACK,但永远等不到------大量半开连接耗尽服务器资源。
正常三次握手: SYN-Flooding:
A → S: SYN E → S: SYN (伪造源地址)
S → A: SYN+ACK S → ???: SYN+ACK (无人回应)
A → S: ACK S: 等待... 资源耗尽
5.6 中间人攻击 (Man-in-the-Middle Attack)
攻击者与通信两端分别建立独立联系,交换所收到的数据。通信双方均认为在直接对话,但整个会话完全被攻击者控制。
5.7 协议交互攻击
同一个密钥被多个协议使用时,攻击者可能利用一个协议中获取的信息攻击另一个协议。
防御:
- 不同协议使用不同密钥;
- 在消息中添加协议标识(协议名称及版本号)并对其认证。
5.8 安全缺陷的根本原因
- 对协议目的、需求和概念没有明确认识和准确描述;
- 运行环境复杂,攻击者无处不在,攻击能力强、手段多;
- 协议设计者误解或采用了不恰当的技术;
- 基本协议缺陷:设计中没有或很少防范攻击者(如公钥加密交换消息不能预防中间人攻击);
- 口令/密钥猜测缺陷:用户选择弱口令,或采用了不安全的伪随机数生成算法。
6. 安全协议设计目标
安全协议设计目标
│
┌─────────────┼─────────────┐
▼ ▼ ▼
认证目标 密钥建立目标 其他目标
6.1 认证目标
由弱到强三个层次:
| 层次 | 定义 |
|---|---|
| 弱身份认证 | A 能确信 B 的身份,且 B 确实参与了协议运行(在证据获得时是活动的)。但 B 可能认为自己是在和 C 通信。 |
| 强身份认证 | A 能建立新鲜的确认:B 知道 A 是 B 的协议对端。 |
| 双向认证 | 双方都能认证对方。若只有一方认证则称为单向认证。 |
SVO 逻辑的观点 :身份认证 = 确认对方响应了一个挑战(时间戳或 Nonce)------这本质上是一个弱身份认证的定义。
Gollman 的观点:A 收到了一个消息,该消息是 A 发出挑战的响应,且该消息中使用了与 B 相关联的密钥。
6.2 密钥建立目标
良好密钥 (Good Key)
A 确认某会话密钥满足:
- 新鲜性:密钥是新生成的;
- 排他性:密钥仅为 A、B(和可信第三方,若存在)所知。
密钥确认 (Key Confirmation)
B 能够确认 A 确实拥有该密钥。
前向安全 (Forward Secrecy)
长期主密钥泄露不会导致过去的会话密钥泄露。
实现原理(以密钥传送协议为例):
- K a − 1 K_a^{-1} Ka−1 和 K b − 1 K_b^{-1} Kb−1 是长期密钥,仅用于签名;
- K T K_T KT 是临时公钥,用于加密会话密钥 K a b K_{ab} Kab;
- K T K_T KT 及对应私钥在 K a b K_{ab} Kab 建立后即销毁;
- 即使长期密钥泄露, K a b K_{ab} Kab 仍然安全。
6.3 其他目标
| 目标 | 说明 |
|---|---|
| 计算效率 | 减少密码运算量(公钥算法 >> 对称算法) |
| 通信效率 | 减少消息数量和长度,减少交互轮数 |
| 无时间戳 | 避免时钟同步问题(时钟同步本身也易受攻击),优先使用 Nonce |
| 通用性 | 协议可用于不同网络层次、不同计算能力设备、不同密码算法 |
7. 安全协议设计原则
Abadi 和 Needham 提出了设计认证协议的若干原则 AN96。这些原则是非形式化的设计指导,既不是安全的充分条件也不是必要条件,但能有效防止常见攻击。
总览
| 原则 | 核心要点 |
|---|---|
| Principle 0 | 效率------不加密不需要加密的内容 |
| Principle 1 | 含义明确------消息含义完全由内容决定 |
| Principle 2 | 声明条件------说清协议适用的前提条件 |
| Principle 3 | 命名------关键消息中必须明确标识主体身份 |
| Principle 4 | 加密目的------知道为什么要加密 |
| Principle 5 | 先签名后加密 |
| Principle 6 | 时间性------有办法判断消息是否重放 |
| Principle 7 | 识别------能区分消息属于哪个协议/哪次运行/第几条 |
| Principle 8 | 信任关系------明确建立协议的信任基础 |
Principle 0:效率原则
协议必须高效。不要做没有必要的加密,不要包含不需要的信息。
- 加密不仅保证机密性,还可验证对方是否拥有密钥、绑定数据等;
- 滥用加密导致运算成本高和协议冗余,且不恰当的加密可能导致错误。
实例------Kerberos 旧版改进:
旧版消息 2 使用了双重加密:
S → A : {KAB, B, L, NA, {KAB, A, L}K_BS}K_AS
新版去除双重加密(昂贵且不必要):
S → A : {KAB, B, L, NA}K_AS, {KAB, A, L}K_BS
Principle 1:含义明确原则
每条消息都能清楚地表达其含义,对消息的解析必须完全依赖于消息的内容。
反例------Needham-Schroeder 协议(有缺陷版):
1. A → B : E_B(Na, A)
2. B → A : E_A(Na, Nb)
3. A → B : E_B(Nb)
消息 2 E_A(Na, Nb) 的问题:不包含 B 的身份标识,无法证明是 B 发出的。攻击者 C 可以将其转发给 A,让 A 误以为 C 在发起通信。
修正(在消息 2 中添加 B 的身份):
2. B → A : E_A(Na, Nb, B)
现在 E_X(Y, Z, W) 的含义明确为:"W 想与 X 通信,通过发送 Y 和 Z"。
Principle 3:命名原则
如果主体身份是关键信息,消息中必须明确包含该主体的名字。
反例------证书传递协议:
3. A → B : CA, CB, { {Kab, Ta}K_a^{-1} }K_b
消息 3 中没有包含 A、B 的身份。B 可以冒充 A 欺骗另一个用户 C:
3'. B(A) → C : CA, CC, { {Kab, Ta}K_a^{-1} }K_c
C 收到后用 A 的公钥验证签名通过,认为 Kab 是 A 发来的。
修正(在签名中包含双方身份):
3. A → B : CA, CB, { {A, B, Kab, Ta}K_a^{-1} }K_b
Principle 5:先签名后加密
主体对已加密的消息签名是不可靠的(签名者可能不知道明文内容);先签名后加密既表明主体认可该消息,又保证了机密性。
反例------CCITT X.509 单消息协议:
A → B : A, {Ta, Na, B, Xa, {Ya}K_b }K_a^{-1}
- 协议目的:保证 Xa、Ya 的完整性,让 B 得知 A 是产生者,并保证 Ya 的机密性。
- 问题:B 无法保证 A 知道 Ya 的内容------攻击者 C 可以将 A 的签名去掉,换成自己的签名发给 B,B 会认为 C 认可了 Ya,但实际上 C 根本不知道 Ya。
Principle 6:时间性原则
接收者必须有办法判断消息是否被重放。
时间性保证手段有三种:Nonce、计数器、时间戳,各有注意事项:
| 手段 | 注意事项 |
|---|---|
| Nonce | 设计者应清楚知道 Nonce 要保证的性质;Nonce 除了新鲜性还常用于绑定主体名(如 Otway-Rees 协议中 N a N_a Na 和 N b N_b Nb) |
| 计数器 | 如果是可预测的计数器,需进行秘密性保护(否则攻击者可预测并提前获取下一个计数值的合法响应) |
| 时间戳 | 系统时间差异应远小于消息有效生存时间;时间同步机制应是系统可信计算基 (TCB) 的一部分 |
计数器漏洞示例------时间同步协议:
A → S : A, Na
S → A : {Ts, Na}K_as
如果 N a N_a Na 是计数器(可预测),则攻击者 C 可:
- 产生 N a + 1 N_a+1 Na+1,发给 S,获得系统时钟消息并保存;
- 当 A 下次使用 N a + 1 N_a+1 Na+1 获取时间时,C 将保存的消息传给 A------A 的系统时间被篡改。
修正 :对 N a N_a Na 加密保护,使其不可预测。
Kerberos 中的时钟问题 :时钟过慢的主体会把过期证书当有效证书使用;时钟过快的主体发出的时间戳 T > T 0 T > T_0 T>T0(实际时间为 T 0 T_0 T0),攻击者可在 T T T 附近重放该消息而不被察觉。
Principle 7:识别原则
主体应能从消息格式中判断该消息属于哪个协议、哪次运行、第几条消息。
反例------NSSK 协议 消息 4 和消息 5:
Msg4: B → A : {Nb}Kab
Msg5: A → B : {Nb + 1}Kab
这两条消息内容不同但格式相同,如果攻击者重放 Msg4,A 可能将其误解为新的 Msg4。修正(添加明确的协议标识和消息编号):
Msg4: B → A : {NSSK, "Message 4", Nb}Kab
Msg5: A → B : {NSSK, "Message 5", Nb}Kab
Principle 8:信任原则
协议设计者应明确:基于怎样的信任关系?为什么基于这种信任?有没有把握保证这种信任?
- Kerberos:信任服务器及其时间源------若服务器发出错误时间戳,整个系统安全性无法保证。
- 大嘴青蛙协议 :由 A 产生会话密钥 K a b K_{ab} Kab------这种信任是否被接受?A 能否保证密钥的保密性、不可重复性和不可预测性?
8. 安全协议设计方法
8.1 fail-stop 协议
fail-stop 协议 (Gong & Syverson 提出):当遭遇任何干扰协议正常执行的主动攻击时,协议将立即停止。
核心断言:主动攻击不会导致 fail-stop 协议在运行时秘密泄露------因为主动攻击者能做的只是让协议停止,并不能获得比被动攻击者更多的信息。
fail-stop 的定义:如果攻击者对协议中某条消息的发送进行了干扰(伪造、篡改、重放、插入、截断等),则协议后继的消息不再发送。
分析三阶段法
- 阶段 1:验证协议的 fail-stop 性质;
- 阶段 2:验证秘密假设------分析被动攻击者是否能得到协议中的秘密;
- 阶段 3:应用 BAN 类逻辑分析协议。
案例分析:Nessett 协议
原始协议不是 fail-stop 的------攻击者窃听到 Msg1 后可转发给诚实主体 C,C 无法判断是转发的还是 A 直接发来的。
修正 :在 Msg1 中添加 B 的身份: { B , N a , K a b } K a − 1 \{B, N_a, K_{ab}\}K_a^{-1} {B,Na,Kab}Ka−1,这样协议变为 fail-stop。
案例分析:大嘴青蛙协议
原始协议存在重放攻击------S 不能分辨重放的消息。攻击者在收到 Msg2 后可再次发给 S,S 会误以为是 B 发起了新协议运行。
修正:只要第 2 条消息和第 1 条消息在格式上有 1 比特差异,协议就是 fail-stop 的。
9. DoS 攻击与防御策略
9.1 DoS 攻击在安全协议中的表现
以 ISO/IEC 11770-3 密钥交换协议 为例:
1. A → B : {Na, A}K_b // 攻击者可冒充 A 大量发送 Msg1
2. B → A : {Na, Nb, B, Kab}K_a, SIG_b // B 进行昂贵的公钥加密和签名运算
攻击者冒充发起方 A 发送大量虚假 Msg1,导致响应方 B:
- 计算耗尽:每次都要进行公钥加密和签名运算(计算昂贵);
- 内存耗尽 :每次都要保存 A、 N a N_a Na、 N b N_b Nb、 K a b K_{ab} Kab 等会话状态。
9.2 防御策略总览
DoS 防御策略
│
┌──────┬──────┼──────┬──────┐
▼ ▼ ▼ ▼ ▼
无状态 Cookie 弱认证 Client Failing-
连接 Puzzle together
9.3 无状态连接方法
核心思路 :响应方在处理请求时不保存会话状态,将状态信息作为响应消息的一部分发给发起方,发起方在下一条消息中再将其返回。
1. I → R : Request
2. R → I : Response, {State_r,i}K_re, HMAC(K_rm, State_r,i)
3. I → R : {State_r,i}K_re, HMAC(K_rm, State_r,i), ...
- K r e K_{re} Kre 和 K r m K_{rm} Krm 仅为响应方知道的密钥,分别用于机密性保护 和完整性保护;
- 在确认对方不是 DoS 攻击者之前,响应方保持无状态;
- 代价:解决了内存耗尽,但计算资源消耗甚至更大(增加了加解密和 HMAC 计算)。
9.4 Cookie 方法
核心思路:协议运行起始,响应方收到请求后发送一小块数据(Cookie),发起方必须在后续消息中包含它。目的是防止攻击者使用假冒网络地址进行 DoS。
Cookie 的四项原则
| 原则 | 要求 | 实现方式 |
|---|---|---|
| 原则 1 | Cookie 必须与特定发起方绑定 | 在生成时绑定对方的 IP 地址和端口 |
| 原则 2 | 仅响应方可生成被接受的 Cookie | 使用本地秘密信息生成和验证 |
| 原则 3 | Cookie 的生成和检验必须足够快 | 使用 HMAC 等快速运算 |
| 原则 4 | 只有 Cookie 验证通过后才分配内存资源 | Cookie 验证是轻量级的 |
典型实现:
Cookie = HMAC(secret, IP-I, IP-R, Port-I, Port-R, context)
Cookie 使用要点
- 每个会话成功后,一定时间内不允许相同的 Cookie 再次出现;
- 对每个发起方进行资源限制(超过限制的会话数则拒绝);
- 限制 Cookie 的有效时间(定期改变本地 secret)。
对 Cookie 机制的攻击
- 攻击者使用真实 IP 获取 Cookie 并攻击(DDoS 中常见);
- 攻击者使用虚假 IP 发请求,通过路径上窃听/源路由获取 Cookie;
- 攻击者窃听发给某 IP 的 Cookie,伪造该 IP 进行攻击。
9.5 Failing-together 方法
核心思路:使发起方计算量 ≥ 响应方计算量,攻击者在试图耗尽响应方资源前先耗尽自己的资源。
实现:基于特殊签名算法(如 SDSS),其特性为:
- 签名中昂贵部分可预先计算 (包含现时材料 R F R_F RF);
- 签名验证时需以较昂贵的代价从签名中重构 R F R_F RF。
流程改造(以 ISO/IEC 11770-3 为例):
Msg2: B → A : {Na, Nb, B, {Rb, Kba}K_be, SIG_b}
Msg3: A → B : {Na, Nb, B, {A, Kab}K_b}K_a^{-1}, Hash(...Rb...)
- B 使用 SDSS 签名 SIG b \text{SIG}_b SIGb,其中 R b R_b Rb 是 R F R_F RF;
- K b a K_{ba} Kba 仅为 B 所知, { R b , K b a } K b e \{R_b, K_{ba}\}K_{be} {Rb,Kba}Kbe 用于无状态;
- A 必须从签名中解出 R b R_b Rb (计算昂贵);
- B 收到 Msg3 后先解密获得 R b R_b Rb 验证签名的轻量级步骤,再验证 Hash。
局限:对单个攻击者有效,对分布式 DDoS 无能为力。
9.6 Client Puzzle 方法
核心思路:响应方不保存状态,而是发给发起方一个密码学问题(Puzzle),发起方解决后才继续协议。
Puzzle 特性:
- 解答耗费资源,验证十分容易;
- 难度可灵活调整。
PHC Puzzle(部分散列碰撞问题)
要求对方求解 x x x,使得 x x x 的 Hash 值左边 b b b 比特全为零:
Hash ( x ) = ( left b ) 0 ... 0 \text{Hash}(x) = (\text{left } b) \; 0\ldots0 Hash(x)=(left b)0...0
对于理想单向散列函数,只能通过暴力测试 求解,平均需要 2 b 2^b 2b 次尝试。
具体协议:
1. R 选择 64 位随机数 Ns,发送 Ns 和难度 b
2. I 求解 64 位 Nc 和 64 位 solution,满足:
Hash(Ns | Nc | solution) = (left b) 0...0
3. I 返回 Nc 和 solution
4. R 验证 Hash 通过后才开始协议运行
Client Puzzle 效果
- b = 18 b=18 b=18 时,发起方平均需 2 18 ≈ 26 2^{18} \approx 26 218≈26 万次测试;
- 对于每秒发 10 万消息的攻击者,攻击强度下降约 6 万倍;
- 对于 DDoS,需征集的主机数为原来的上万倍。
注意事项:
- N s N_s Ns、 N c N_c Nc 和 Solution 长度不能太小,否则攻击者可预先计算查找表;
- N s N_s Ns 应定期更新,防止重放攻击。
附录:关键概念速查表
| 概念 | 简要解释 |
|---|---|
| Nonce | 一次性随机数,保证消息新鲜性,防御重放攻击 |
| 前向安全 | 长期密钥泄露不影响过去会话密钥的安全性 |
| fail-stop 协议 | 遇主动攻击即停止,防止秘密泄露 |
| Cookie | 响应方生成的小块数据,绑定发起方,防御地址伪造 DoS |
| Client Puzzle | 密码学难题,增加发起方计算代价以防御 DoS |
| PHC Puzzle | 部分散列碰撞难题,需暴力求解 |
| SDSS 签名 | 签名可预计算,验证需重构 R F R_F RF,用于 failing-together 方法 |
| 反射攻击 | 将消息重放回发送方,利用发送方自身解密 |
| 类型攻击 | 利用消息格式不明确,使接收者错误解释消息 |
参考教材:《安全协议分析与设计》(卫剑钒、陈钟,2010)、《安全协议设计与分析》(张文政,2015)