### 怎么防重放攻击

1. 使用一次性令牌 (Nonce) 或时间戳

这是最常见也最有效的防范手段。核心思想是确保每个请求都是唯一的，即使被截获也无法再次使用

- 一次性令牌 (Nonce): 这是一个随机生成的、只使用一次的字符串
  - 工作原理: 服务器在发送给客户端的页面中嵌入一个隐藏的 Nonce。客户端在发送请求时，必须将这个 Nonce 包含在内。服务器端会验证这个 Nonce 是否被使用过。如果 Nonce 数据库中已存在，则拒绝该请求
  - 优点: 安全性高，能有效防止攻击者重复使用旧的请求
  - 缺点: 需要在服务器端维护一个 Nonce 数据库，增加了状态管理的复杂性
- 时间戳 (Timestamp): 在请求中加入当前时间戳
  - 工作原理: 客户端在发送请求时，将当前时间戳也作为参数发送。服务器接收到请求后，会检查时间戳是否在设定的有效时间窗口内（例如，30秒）。如果时间戳过期，则拒绝请求
  - 优点: 实现简单，不依赖于 Nonce 数据库
  - 缺点: 依赖于客户端和服务器时间的同步，如果两者时间差异较大，可能会导致正常请求被拒绝

2. 添加序列号

在通信协议中为每个请求添加一个递增的序列号

- 工作原理: 客户端在发送请求时，将一个单调递增的序列号也包含在内。服务器端会记录每个客户端会话的最新序列号。如果收到一个序列号比当前记录的小或等于的请求，则认为这是重放攻击，并拒绝该请求
- 优点: 简单有效，特别适用于有序的协议
- 缺点: 如果序列号在传输过程中丢失或被修改，可能会导致同步问题

3. 使用安全哈希和消息认证码

这种方法可以验证消息的完整性和来源，从而发现消息是否被篡改或重放

- 工作原理: 客户端在发送请求时，使用共享密钥对整个请求数据（包括时间戳或 Nonce）计算一个消息认证码 (MAC)，并将 MAC 附加在请求后面。服务器端收到请求后，用同样的密钥和数据重新计算 MAC，如果两个 MAC 不匹配，则请求无效
- 优点: 提供了数据完整性校验和来源认证，能够防御篡改和重放攻击
- 缺点: 需要安全地管理和分发共享密钥。

4. 限制请求有效期

即使没有上述复杂的机制，也可以通过限制请求的有效期来增加重放攻击的难度

- 工作原理: 服务器可以为每个请求设置一个短暂的生命周期。例如，当客户端请求登录凭证时，服务器可以返回一个有效期为 5 分钟的令牌。如果攻击者截获了这个令牌，它只能在 5 分钟内使用，过期后即失效
- 优点: 简单且易于实现
- 缺点: 不能完全防止在短时间内进行的重放攻击