如何有效防止API的重放攻击?

3,725 阅读3分钟
原文链接: henray.me

如何有效防止API的重放攻击?调用API产品常见问题_API 网关-阿里云
请求签名说明文档_用户指南(调用API)_API 网关-阿里云

API重放攻击(Replay Attacks)又称重播攻击、回放攻击,这种攻击会不断恶意或欺诈性地重复一个有效的API请求。攻击者利用网络监听或者其他方式盗取API请求,进行一定的处理后,再把它重新发给认证服务器,是黑客常用的攻击方式之一。

HTTPS数据加密是否可以防止重放攻击?

否,加密可以有效防止明文数据被监听,但是却防止不了重放攻击。

使用签名防止重放攻击

使用签名之后,可以对请求的身份进行验证。但不同阻止重放攻击,即攻击者截获请求后,不对请求进行任何调整。直接使用截获的内容重新高频率发送请求。

API网关提供了一套有效防止重放攻击的方法。开启API网关的放重放,需要您使用“阿里云APP”的认证方式。通过这种签名认证方式,每个请求只能被使用一次,从而防止重放。

阿里云APP:是基于请求内容计算的数字签名,用于API网关识别用户身份。客户端调用API时,需要在请求中添加计算的签名。API网关在收到请求后会使用同样的方法计算签名,同用户计算的签名进行比较,相同则验证通过,不同则认证失败。这种认证的签名方式请参照:请求签名

在API网关的签名中,提供X-Ca-Timestamp、X-Ca-Nonce两个可选HEADER,客户端调用API时一起使用这两个参数,可以达到防止重放攻击的目的。

原理

  1. 请求所有的内容都被加入签名计算,所以请求的任何修改,都会造成签名失败。
  2. 不修改内容
    • X-Ca-Timestamp:发起请求的时间,可以取自机器的本地实现。当API网关收到请求时,会校验这个参数的有效性,误差不超过15分钟。
    • X-Ca-Nonce:这个是请求的唯一标识,一般使用UUID来标识。API网关收到这个参数后会校验这个参数的有效性,同样的值,15分钟智能被使用一次。

那么比如,下面这个请求:

a.com?uid=123×tamp=1480556543&nonce=43f34f33&sign=80b886d71449cb33355d017893720666

sign = md5({秘要}key1=val1&key2=val2&key3=val3…)

服务端接到这个请求:

  1. 先验证sign签名是否合理,证明请求参数没有被中途篡改。
  2. 再验证timestamp是否过期,证明请求是在最近60s被发出的。
  3. 最后验证nonce是否已经有了,证明这个请求不是60s内的重放请求。