java通过sign签名+时间戳的方式防止rest接口被恶意抓包调用和重放(转)

java通过sign签名+时间戳的方式防止rest接口被恶意抓包调用和重放

  • 要避免接口被恶意利用,我们可以在网关连接器进行验签的操作,也就是sign。但是攻击者还可以重放数据包,那具体应该要怎么做呢?下面我提供3个方法,供大家参考。同时再此记录下,方便翻阅。
  • https://blog.csdn.net/u014270696/article/details/97372584

方法1:请求接口的参数中添加时间戳

  • 具体实现原理:每次客户端发送请求时,获取当前时间戳,当参数一同发送到服务器,服务器拦截该请求,获取服务器上当前时间戳和客户端请求中的时间戳进行比较,如果两个时间戳相差超过60s的话就认定为非法请求,因为一般一次正常的http请求发送到服务器不会超过60秒,所以可以这样做。

  • 这样可以做到简单的防重放,但是并不能 真的解决重放的问题,时间戳如果被修改为当前时间戳的话。那这种方式就失效了。

  • 这时候就需要另外一种方式了
    lvn27V.jpg

方法2:请求接口的参数中添加sign签名

  • 具体实现原理:使用签名验证,保证每次请求时候签名只能使用一次。

  • 客户端和服务器端约定一个生成签名串的算法,可以由客户端ip+加密密钥+当前时间戳进行MD5加密生成,前端生成签名串后,跟随参数一起发送到后台解密,并将该签名串保存在redis中,下次请求的时候,先在redis中取查找是否有该签名串,如果有,则说明是非正常请求,这时候就可以认定为非法操作。

  • 但是这样也会存在一个问题,也就是随着时间的推移,redis中会保存越来越多的这样的sign签名,对于服务器资源消耗是一笔不小的开销,这时候需要是我们去清理了,当然我们可以选择给每个sign设定一个过期时间,让他自动清理,比如说设置1天的有效时长,这样当天就不能使用这个sign来请求了,但是一天后还是可以继续使用。这样也有隐患。这时候可以结合时间戳验证和sign签名验证。
    lvnyXn.jpg

方法3:请求接口的参数中添加sign签名+时间戳(推荐)

  • 具体实现原理:客户端生成MD5加密签名串,和当前时间戳跟随请求的参数一起发送到后台,后台获取签名进行解密,然后保存到redis中并设置一个失效时长(60s),则60s内不能使用相同的sign发送请求,然后获取系统当前时间戳和前端发送过来的时间戳做比较,如果两者相差超过60s,则认定为非法操作。

  • 这种方式既能保证防止请求重放,又能有效节省服务器资源,推荐使用。
    lvncmq.jpg

Java 代码层

lv3Qb9.md.jpg