Nonce与重放攻击

重放攻击(Replay attack)是一种网络攻击,它恶意的欺诈性的重复或拖延正常的数据传输。 —— [ Wikipedia ]

使用签名认证方式设计的RESTFul API,当请求信息被第三方拦截之后,由于其含有认证信息,当再次发起该请求时,如果没有相应的保护机制,请求会再次通过验证,造成重放攻击的风险。

为避免该问题,通常情况下的做法是:

每次发起HTTP请求,都需要加上timestamp参数,然后把timestamp和其他参数一起进行签名。服务端接收到HTTP请求后,将客户端timestamp与服务端当前时间比较,判断是否超过了请求有效期,比如60s,如果超过了则认为是非法的请求。

如此一来从第一次请求发起的时间算起,60s之后再访问时会被服务端拒绝,但是在60s有效期内,依然可以发起重放攻击。

解决方案:

  1. 客户端生成一个随机字符串Nonce (Number used once), 并且参与签名
  2. 服务端第一次接收到请求,去缓存中查询Nonce是否存在
    1. 如果不存在,则认为在有效期内该请求第一次访问,放行;然后将Nonce保存在缓存中,并设置有效期为60s,60s之后该Nonce缓存失效被清除
    2. 如果存在,则认为在有效期内该请求Replay,拒绝提供访问

需要保证的是有效期内并发请求生成随机数的唯一性。