API防重放攻击

目录

一、API重放攻击:

二、重放攻击的防御方案

2.1 基于timestamp方案

2.2 基于nonce方案

2.3 基于timestamp+nonce方案

三、服务端实现流程


一、API重放攻击:

把你的请求原封不动地再发送一次,两次...n次,重放攻击是二次请求,黑客通过抓包获取到了请求的HTTP报文,然后黑客自己编写了一个类似的HTTP请求,发送给服务器。 也就是说服务器处理了两个请求,先处理了正常的HTTP请求,然后又处理了黑客发送的篡改过的HTTP请求。

如果这个正常逻辑是插入数据库操作,那么一旦插入数据库的语句写的不好,就有可能出现多条重复的数据。一旦是比较慢的查询操作,就可能导致数据库堵住等情况。

概念:

重放攻击是计算机世界黑客常用的攻击方式之一,所谓重放攻击就是攻击者发送一个目的主机已接收过的包,来达到欺骗系统的目的,主要用于身份认证过程。

二、重放攻击的防御方案

2.1 基于timestamp方案

方法:

  • 每个http请求都加上timestamp参数, timestamp参数还要跟其他参数进行数字签名。这样黑客把截获的包拿到,即使修改timestamp参数,但是他不知道token,签名没改,签名就会验证失败。

  • 后台拿到一个http请求后,验证时间戳是否超过60s,超过了说明是二次请求。

缺陷:

  • 如果在60s以内进行重放攻击,就防不住了。

2.2 基于nonce方案

方法:

  • nonce就是一个唯一的随机字符串,同时也要最为数字签名的一部分,这样黑客拿到请求内容也无法篡改nonce,因为黑客不知道token,不能生产新的签名。

  • 每次请求是带上这个nonce参数。

  • 方便起见,直接使用时间戳做为种子,随机生成16位字符串做为nonce参数。

  • 把nonce存到redis中,每次处理HTTP请求,就去判断请求的nonce值是否在redis中,存在则认为非法。

缺陷:

  • 存储nonce的redis会越来越大,验证nonce是否是存在redis中的耗时会越来越大。

  • 用清理的方式,比如就保留一天,但是一天后之前的包就能重放攻击。

2.3 基于timestamp+nonce方案

方法:

  • 每个请求带上时间戳,不能和当前超过一定时间(60s),黑客只能在60s内进行重放攻击。

  • 使用nonce随机数,防止60s内出现重复请求。

实现:

  • timstamp参数对于超过60s的请求,都认为非法请求;

  • redis存储60s内的nonce参数的集合,60s内重复则认为是非法请求。

三、服务端实现流程

time是发送请求的时间,nonce是随机串,sign是对uuid、time、nonce的签名。

1、先验证sign签名是否合理,证明请求参数没有被中途篡改。

2、再验证time是否过期,证明请求是在最近60s被发出的。

3、最后验证nonce是否已经有了,证明这个请求不是60s内的重放请求。

  1. 去redis中查找是否有key为nonce的数据。

  2. 如果没有,则创建这个key,把这个key的失效时间和验证time失效的时间一致,比如是60s。

  3. 如果有,说明这个key在60s内已经被使用了,那么这个请求就可以判断为重放请求。

总结:

接口都是进行过加密的,服务端根据请求头中的appId就能知道之前协商好的密钥,就能解密数据。

请求的数据,我们有时间戳,有nonce随机值,这两个值都是参与加密的,所以黑客无法篡改。

通过时间戳,超过10s的请求我们认为就是无效请求,10s内的,我们在检查nonce值是否有存在了,存在说明之前请求过,则新的请求就是无效的。

猜你喜欢

转载自blog.csdn.net/songtaiwu/article/details/125277144