Skip to content

API 安全防护

在 API 服务中,X-TimestampX-NonceX-AccessKeyX-Signature 是常见的 API 请求签名机制核心组件,主要用于 身份验证数据完整性验证防止重放攻击

核心组件解析

1. X-Timestamp(时间戳)

作用

  • 记录请求发起时间(通常为 Unix 时间戳),用于服务端验证请求时效性。

解决的问题

  • 防止重放攻击:服务端设定时间戳有效期(如 5 分钟),过期请求直接拒绝,攻击者无法超时重放截获的合法请求。
  • 同步性校验:确保客户端与服务端时间偏差在合理范围,避免时间篡改影响请求有效性。

2. X-Nonce(一次性随机数)

作用

  • 生成唯一随机字符串(如 UUID),确保同一请求的唯一性。

解决的问题

  • 防止重复请求:服务端缓存 Nonce 值(或结合时间戳),拒绝已处理的重复请求。
  • 增强签名动态性:即使参数相同的请求,因 Nonce 不同,签名结果不同,避免签名被复用。

3. X-AccessKey(访问密钥)

作用

  • 标识客户端身份(如用户、应用或服务),通常与服务端预分配的 SecretKey 配对使用。

解决的问题

  • 身份认证:验证请求方是否为合法注册的客户端。

4. X-Signature(请求签名)

作用

  • 客户端使用 SecretKey 对请求内容(参数、路径、时间戳、Nonce 等)生成签名,服务端用相同算法验签。

解决的问题

  • 数据完整性:确保请求在传输过程中未被篡改(参数修改会导致验签失败)。
  • 防伪造身份:攻击者缺少 SecretKey 无法生成正确签名,无法伪造合法请求。
  • 绑定关键参数:签名算法通常包含请求方法、路径、参数等,确保请求内容与签名一致。

整体流程示例

客户端生成签名步骤

  1. 拼接请求数据
  2. 使用 SecretKey 通过加密算法生成签名,存入 X-Signature 头部。
  3. X-TimestampX-NonceX-AccessKeyX-Signature 添加到请求头中发送。

服务端验证流程

  1. 校验时间戳:检查是否在有效期内(如 ±5 分钟)。
  2. 校验 Nonce:检查是否已存在(防止重复请求,可结合时间戳缓存)。
  3. 验签:通过 AccessKey 查找对应的 SecretKey,按相同算法重新生成签名,比对是否与 X-Signature 一致。
  4. 结果处理:全部通过则执行请求逻辑,否则返回 401 Unauthorized403 Forbidden 错误。

机制优势总结

功能实现方式
身份认证AccessKey 识别客户端身份,Signature 验证客户端持有合法 SecretKey
数据防篡改签名绑定请求内容(方法、路径、参数等),任何修改均会导致验签失败。
防重放攻击Timestamp 确保时效性,Nonce 确保请求唯一性,双重机制拒绝重复/超时请求。
抗抵赖性签名可追溯请求来源,客户端无法否认发起的合法请求。