7-49
约 851 字大约 3 分钟
2025-11-02
怎么防重放攻击
1. 使用一次性令牌 (Nonce) 或时间戳
这是最常见也最有效的防范手段。核心思想是确保每个请求都是唯一的,即使被截获也无法再次使用
- 一次性令牌 (Nonce): 这是一个随机生成的、只使用一次的字符串
- 工作原理: 服务器在发送给客户端的页面中嵌入一个隐藏的 Nonce。客户端在发送请求时,必须将这个 Nonce 包含在内。服务器端会验证这个 Nonce 是否被使用过。如果 Nonce 数据库中已存在,则拒绝该请求
- 优点: 安全性高,能有效防止攻击者重复使用旧的请求
- 缺点: 需要在服务器端维护一个 Nonce 数据库,增加了状态管理的复杂性
- 时间戳 (Timestamp): 在请求中加入当前时间戳
- 工作原理: 客户端在发送请求时,将当前时间戳也作为参数发送。服务器接收到请求后,会检查时间戳是否在设定的有效时间窗口内(例如,30秒)。如果时间戳过期,则拒绝请求
- 优点: 实现简单,不依赖于 Nonce 数据库
- 缺点: 依赖于客户端和服务器时间的同步,如果两者时间差异较大,可能会导致正常请求被拒绝
2. 添加序列号
在通信协议中为每个请求添加一个递增的序列号
- 工作原理: 客户端在发送请求时,将一个单调递增的序列号也包含在内。服务器端会记录每个客户端会话的最新序列号。如果收到一个序列号比当前记录的小或等于的请求,则认为这是重放攻击,并拒绝该请求
- 优点: 简单有效,特别适用于有序的协议
- 缺点: 如果序列号在传输过程中丢失或被修改,可能会导致同步问题
3. 使用安全哈希和消息认证码
这种方法可以验证消息的完整性和来源,从而发现消息是否被篡改或重放
- 工作原理: 客户端在发送请求时,使用共享密钥对整个请求数据(包括时间戳或 Nonce)计算一个消息认证码 (MAC),并将 MAC 附加在请求后面。服务器端收到请求后,用同样的密钥和数据重新计算 MAC,如果两个 MAC 不匹配,则请求无效
- 优点: 提供了数据完整性校验和来源认证,能够防御篡改和重放攻击
- 缺点: 需要安全地管理和分发共享密钥。
4. 限制请求有效期
即使没有上述复杂的机制,也可以通过限制请求的有效期来增加重放攻击的难度
- 工作原理: 服务器可以为每个请求设置一个短暂的生命周期。例如,当客户端请求登录凭证时,服务器可以返回一个有效期为 5 分钟的令牌。如果攻击者截获了这个令牌,它只能在 5 分钟内使用,过期后即失效
- 优点: 简单且易于实现
- 缺点: 不能完全防止在短时间内进行的重放攻击