一种API接口防止重放攻击的方法

文档序号:26586706发布日期:2021-09-10 19:29阅读:333来源:国知局
一种API接口防止重放攻击的方法
一种api接口防止重放攻击的方法
技术领域
1.本发明属于计算机技术领域,具体涉及一种api接口防止重放攻击的方法。


背景技术:

2.在如今互联网高速发展,信息系统安全成为重中之重,而在一次http请求中,从请求方到服务器接收方中间经过很多路由器和交换机,恶意网络攻击者可以通过抓包的方式中途截获请求包数据,从而发送一个目的主机已经接收过的包,来达到欺骗系统的目的,可能会造成信息的窃取甚至系统的瘫痪等严重后果。
3.目前防重放攻击的方式主要有:1、基于时间戳timestamp的加密签名方案,服务端使用约定的密钥对请求的参数再次签名,和接收的签名对比,防止参数被篡改,只针对时间戳有效时间内的请求视为有效合法,例如60s内请求有效,超过则视为超时。这种存在时间戳内的重放攻击无法识别和阻拦,存在缺陷。2、基于唯一有效的随机字符串码nonce码,也称唯一识别码,是通过时间戳+mac地址等唯一参数生成后做哈希得来,处理的http请求时,首先创建nonce码的缓存集合,请求的nonce码在集合中已经存在,则认为是重放攻击的非法请求,如果不存在则添加进缓存集合中,通过这种方式可以拒绝多次发送的请求。nonce码作为签名sign参数的一部分,{userid,token,nonce},因为攻击者不清楚token和密钥,因此无法生成sign,但是这种方案由于对nonce码存储越来越大,最终验证nonce是否存在“集合”缓存中所需要的耗时将越来越长,因此该方案造成内存上很大的开销,如果定时清理,又无法保障重放攻击,因此存在很大的弊端。
4.目前相对成熟的防重放攻击的方案是以上两个方案的结合,以下称结合方案,即时间戳超时配置加上识别码缓存判重的方案,来达到拒绝重放恶意攻击,首先通过加密sign数据的合法性判断接口参数的有效性,再判断请求时间戳与服务器时间比对是否超时,关键的一步就是利用唯一性的nonce等识别码进行缓存集合中,并在超时后清理,新的请求解析出来的nonce码判断是否在集合中重复存在,如果重复则视为非法请求,对非法请求进行拦截,从而解决内存开销的问题,保障数据安全防篡改,同时又能在有效时间戳内达到防重放攻击的效果。
5.现有的相对成熟的防重放攻击方法存在以下几点缺点:
6.(1)由于在接口请求中,重放攻击属于小概率事件,其大范围的处理接口请求都是正常的接口,上述结合方案缺点在于对每次的正常接口请求都需要无差别检验,即从集合中查询唯一识别码是否重复,然后缓存识别码,同时清理集合中过期的识别码,导致大量的判重

缓存

清理这样流程工作都耗费在正常接口处理中,这样无形中给服务器增加了负担;
7.(2)唯一识别码的nonce码存储需要实时维护,清理时间戳超时失效的nonce码,添加新的nonce码,而算法的复杂度因nonce码可变缓存长度变化的,需要一定的维护成本。


技术实现要素:

8.本发明所要解决的技术问题是针对上述现有技术的不足提供一种api接口防止重放攻击的方法,其基于时间戳,引入唯一时序码来标记请求,再通过二进制位状态压缩记录接口重复状态来实现,只需要缓存两组数据,即状态码和最新时序码,将正常请求和疑似问题请求差别化处理,对正常请求接口完成优化加速,并通过二进制压缩状态位左移自动维护状态,无需手动维护,既能完成防重放攻击的效果,也减少内存的开销,同时减轻维护的成本。
9.为实现上述技术目的,本发明采取的技术方案为:
10.一种api接口防止重放攻击的方法,其特征在于包含以下步骤:
11.第一步:接口请求时根据请求端的时间戳与服务器时间校准,计算差值供请求端做校准,保证请求端时间与服务器时间基本同步;
12.第二步:根据请求端的http请求框架设置接口超时时间,常见以30秒为例,接口请求时间为t1,服务器当前时间为t2,如果t1>t2,则为非法参数的请求,若t2

t1>=30秒,则接口超时,非法接口和超时接口的请求给予拒绝处理,当t2

t1<30秒,视为合法;
13.第三步:api接口请求端生成唯一时序码,时序码=时间戳+uuid+自增数+复位标志,其中自增数在单用户请求端每请求一次,接口的自增数都+1,以此保证相邻接口的自增数间隔为1,当自增数达到位数最大值,下一个请求自增数归0化处理,如果自增数差值运算中出现负值或者接近最大值的数,根据时间戳的单调性,用最大值做补偿运算从而计算出准确的自增数差值,因此在比较两个请求接口的时序码时,时间戳大的,自增数(经补偿运算后)也大,成正比关系,而最新请求的接口,自增数和时间戳都是最大的,当服务器接收到的时序码的时间戳比缓存中的大,那么接收到的请求则为新的正常请求,这是由于加密验签,攻击者只能截获报文重放,无法创造新的请求,因此新的请求为正常请求,旧的请求则为疑似异常请求;
14.第四步:api接口请求端将时序码与用户id以及token组合验签码{时序码,token,用户id},将验签码进行加盐加密,通过对称加密生成密文放在请求参数中,和时间戳、ip、mac地址等其他信息组成请求报文发送至服务端,服务端接收参数解密后,查看时序码中的时间戳与参数中的时间戳是否一致,token是否有效,以及当复位标志为1时检查时序码是否有效,如果校验失败,则定位本次请求为篡改的重放攻击,拒绝处理服务,如果校验成功则视为正常请求;
15.第五步:服务端初次接收请求创建状态码,用数组status表示,通过二进制左移插入新状态位,左移过程中,最低位用0补齐,status[i+1]的低位用status[i]的高位补齐,以此达到status的所有状态码的整体左移,通过位运算获取其中某个状态位的值来判断对应接口的处理状态;
[0016]
第六步:解析api请求接口的时序码,提取时间戳和自增数以及复位标志,复位标志为1则初始化状态码,并清除时序码的缓存,计算自增数差值n=新请求自增数

服务器缓存时序码中的自增数,并根据时间戳单调性做n的补偿运算,若n>0,则请求时序码中时间戳段大于服务器缓存的时间戳段,该请求为最新请求属于正常请求,此时将status的二进制状态码整体左移n位,低位用0补齐,高位移出的视为状态位自动清理,更新第1位状态值为1,并将更新后的状态码status全部缓存下来,同时用最新接口的时序码替换旧的缓存下
来;若n=0,新请求的时序码与服务器缓存的时序码一致,为重放攻击,拒绝处理;若1

max<=n<0,则新请求的时序码中时间戳段小于服务器缓存的时间戳段,查看第1

n位状态,若值是0,则说明该请求由于网络异常或中间路由异常,请求滞后收到,为正常请求,更新第1

n位状态值为1,并将更新后的状态码status全部缓存下来,时序码不做更新缓存操作,反之,如果第1

n位状态值是1,则说明该时序码对应的首次请求已收到并处理,该请求为重放攻击,拒绝处理;
[0017]
第七步:若n<1

max,说明在时间戳有效期内的请求已击穿二进制状态码位数的阈值,这种极端场景下,通过下发接口响应特殊错误码,请求端回调中针对此响应错误码自动拦截并触发请求的重发机制,此时新的请求时序码和时间戳为最新,将顺利通过第六步,完成接口请求处理,同时服务系统触发扩容机制,将状态码位数容量增加一倍,以此达到系统服务的自平衡,二进制状态码左移中高位移出的状态位不做处理,实现过期状态位的自动清理,无需服务去处理。
[0018]
上述的步骤三中复位标志,0为不复位,1为复位,其目的是为了当api接口请求端的缓存被人为清理或丢失,自增数从零计数,服务端状态码可通过复位标志重新初始化,并清除时序码缓存,以免造成正常请求无法访问。
[0019]
上述的步骤四中复位标志为1时的时序码校验是否有效,是利用最近复位时序码的判重以及剔除先于复位前旧时间戳的时序码,可规避带复位状态接口请求制造的重放攻击。
[0020]
上述的步骤五中的数组status类型为long型数组,数组默认大小为4,初始值为十六进制全0数据,即[0x0000 0000,0x0000 0000,0x0000 0000,0x0000 0000],设置数组下标i,i取值[0,3],第i个的二进制状态位记录的区间为[i*32+1,(i+1)*32],默认的status数组数据对应的二进制数据状态压缩可记录128个状态位,单个状态位的值0代表请求未处理,1代表请求已处理,从第1位状态到第128位状态依次顺序记录近128个接口处理状态。
[0021]
上述的步骤五中可根据业务量调整默认状态位的容量,如果时间戳有效期内状态位的128位容量被击穿,采用自动扩容,由128位扩容至256位,即status数组大小从4扩容至8,以此内推,实现业务系统的自平衡。
[0022]
上述的步骤六中若n>0时更新第1位状态值为1程序实现用左移n位后的status[0]与0x0000 0001做或运算,并将结果赋值给status[0]。
[0023]
上述的步骤六中若1

max<=n<0时查看第1

n位状态值程序实现用status[

n/32]和1<<(

n)%32做与运算,其结果右移(

n)%32位。
[0024]
上述的步骤六中若1

max<=n<0时更新第1

n位状态值为1程序实现用status[

n/32]和1<<(

n)%32做或运算,并将结果重新赋值给status[

n/32]。
[0025]
本发明能够快速区分两类请求,即正常请求和疑似异常请求,对正常请求不做算法检验,只记录最新时序码;而对疑似的异常请求,筛选出因网络延迟、路由等原因滞后的请求和重放攻击的请求,从而对重放攻击请求拒绝处理,对滞后的正常请求做有效处理,从而减轻服务不必要的开销;易维护且能准确识别重放攻击,不需要主动实时地维护清理状态码,且能够根据业务量实现自平衡,达到最优效果;基于时间戳,引入唯一时序码来标记请求,再通过二进制位状态压缩记录接口重复状态来实现;通过以上步骤只需要缓存两组数据,即状态码和最新时序码,将正常请求和疑似问题请求差别化处理,对正常请求接口完
成优化加速,并通过二进制压缩状态位左移自动维护状态,无需手动维护,既能完成防重放攻击的效果,也减少内存的开销,同时减轻维护的成本;通过发明的时序码对接口请求拆分为正常请求和疑似异常请求,只对疑似异常请求做状态检测;通过发明的状态码,实现对接口请求状态进行标记和校验,可以识别出重放攻击的请求,同时不需要对状态位实时维护清理,且能根据业务量实现自动扩容,实现系统的自平衡。
[0026]
本发明的优点在于以下几点:
[0027]
(1)将接口请求做差别化处理,通过时序码将请求拆分为正常请求和疑似异常请求,对正常请求不做算法检验,只记录最新的时序码,而对疑似异常请求,通过本发明方法筛选出是网络延迟请求和重放攻击请求,从而对重放攻击请求拒绝处理,对网络延迟的请求做正常有效处理,从而减轻服务不必要的开销;
[0028]
(2)采用二进制状态码,通过移位自动实现旧状态移除,无需对旧状态耗费维护成本,同时根据业务量自动实现扩容,达到业务量的自平衡效果,且能准确识别重放攻击的检验,达到最优方案。
附图说明
[0029]
图1为本发明的工作流程图。
具体实施方式
[0030]
下面结合附图对本发明的具体实施方式作出进一步说明:
[0031]
一种api接口防止重放攻击的方法,其特征在于:其特征在于包含以下步骤:
[0032]
第一步:接口请求时根据请求端的时间戳与服务器时间校准,计算差值供请求端做校准,保证请求端时间与服务器时间基本同步;
[0033]
第二步:根据请求端的http请求框架设置接口超时时间,常见以30秒为例,接口请求时间为t1,服务器当前时间为t2,如果t1>t2,则为非法参数的请求,若t2

t1>=30秒,则接口超时,非法接口和超时接口的请求给予拒绝处理,当t2

t1<30秒,视为合法;
[0034]
第三步:api接口请求端生成唯一时序码,时序码=时间戳+uuid+自增数+复位标志,其中自增数在单用户请求端每请求一次,接口的自增数都+1,以此保证相邻接口的自增数间隔为1,当自增数达到位数最大值,下一个请求自增数归0化处理,如果自增数差值运算中出现负值或者接近最大值的数,根据时间戳的单调性,用最大值做补偿运算从而计算出准确的自增数差值,因此在比较两个请求接口的时序码时,时间戳大的,自增数(经补偿运算后)也大,成正比关系,而最新请求的接口,自增数和时间戳都是最大的,当服务器接收到的时序码的时间戳比缓存中的大,那么接收到的请求则为新的正常请求,这是由于加密验签,攻击者只能截获报文重放,无法创造新的请求,因此新的请求为正常请求,旧的请求则为疑似异常请求;
[0035]
第四步:api接口请求端将时序码与用户id以及token组合验签码{时序码,token,用户id},将验签码进行加盐加密,通过对称加密生成密文放在请求参数中,和时间戳、ip、mac地址等其他信息组成请求报文发送至服务端,服务端接收参数解密后,查看时序码中的时间戳与参数中的时间戳是否一致,以及token是否有效,以及当复位标志为1时检查时序码是否有效,如果校验失败,则定位本次请求为篡改的重放攻击,拒绝处理服务,如果校验
成功则视为正常请求;
[0036]
第五步:服务端初次接收请求创建状态码,用数组status表示,通过二进制左移插入新状态位,左移过程中,最低位用0补齐,status[i+1]的低位用status[i]的高位补齐,以此达到status的所有状态码的整体左移,通过位运算获取其中某个状态位的值来判断对应接口的处理状态;
[0037]
第六步:解析api请求接口的时序码,提取时间戳和自增数以及复位标志,复位标志为1则初始化状态码,并清除时序码的缓存,计算自增数差值n=新请求自增数

服务器缓存时序码中的自增数,并根据时间戳单调性做n的补偿运算,若n>0,则请求时序码中时间戳段大于服务器缓存的时间戳段,该请求为最新请求属于正常请求,此时将status的二进制状态码整体左移n位,低位用0补齐,高位移出的视为状态位自动清理,更新第1位状态值为1,并将更新后的状态码status全部缓存下来,同时用最新接口的时序码替换旧的缓存下来;若n=0,新请求的时序码与服务器缓存的时序码一致,为重放攻击,拒绝处理;若1

max<=n<0,则新请求的时序码中时间戳段小于服务器缓存的时间戳段,查看第1

n位状态,若值是0,则说明该请求由于网络异常或中间路由异常,请求滞后收到,为正常请求,更新第1

n位状态值为1,并将更新后的状态码status全部缓存下来,时序码不做更新缓存操作,反之,如果第1

n位状态值是1,则说明该时序码对应的首次请求已收到并处理,该请求为重放攻击,拒绝处理;
[0038]
第七步:若n<1

max,说明在时间戳有效期内的请求已击穿二进制状态码位数的阈值,这种极端场景下,通过下发接口响应特殊错误码,请求端回调中针对此响应错误码自动拦截并触发请求的重发机制,此时新的请求时序码和时间戳为最新,将顺利通过第六步,完成接口请求处理,同时服务系统触发扩容机制,将状态码位数容量增加一倍,以此达到系统服务的自平衡,二进制状态码左移中高位移出的状态位不做处理,实现过期状态位的自动清理,无需服务去处理。
[0039]
优选的,步骤三中复位标志,0为不复位,1为复位,其目的是为了当api接口请求端的缓存被人为清理或丢失,自增数从零计数,服务端状态码可通过复位标志重新初始化,并清除时序码缓存,以免造成正常请求无法访问。
[0040]
优选的,步骤四中复位标志为1时的时序码校验是否有效,是利用最近复位时序码的判重以及剔除先于复位前旧时间戳的时序码,可规避带复位状态接口请求制造的重放攻击。
[0041]
优选的,步骤五中的数组status类型为long型数组,数组默认大小为4,初始值为十六进制全0数据,即[0x0000 0000,0x0000 0000,0x0000 0000,0x0000 0000],设置数组下标i,i取值[0,3],第i个的二进制状态位记录的区间为[i*32+1,(i+1)*32],默认的status数组数据对应的二进制数据状态压缩可记录128个状态位,单个状态位的值0代表请求未处理,1代表请求已处理,从第1位状态到第128位状态依次顺序记录近128个接口处理状态。
[0042]
优选的,步骤五中可根据业务量调整默认状态位的容量,如果时间戳有效期内状态位的128位容量被击穿,采用自动扩容,由128位扩容至256位,即status数组大小从4扩容至8,以此内推,实现业务系统的自平衡。
[0043]
优选的,步骤六中若n>0时更新第1位状态值为1程序实现用左移n位后的status
[0]与0x0000 0001做或运算,并将结果赋值给status[0]。
[0044]
优选的,步骤六中若1

max<=n<0时,查看第1

n位状态值程序实现用status[

n/32]和1<<(

n)%32做与运算,其结果右移(

n)%32位。
[0045]
优选的,步骤六中若1

max<=n<0时,更新第1

n位状态值为1程序实现用status[

n/32]和1<<(

n)%32做或运算,并将结果重新赋值给status[

n/32]。
[0046]
本发明能够快速区分两类请求,即正常请求和疑似异常请求,对正常请求不做算法检验,只记录最新的时序码这个身份唯一码;而对疑似的异常请求,筛选出因网络延迟、路由等原因滞后的请求和重放攻击的请求,从而对重放攻击请求拒绝处理,对滞后的正常请求做有效处理,从而减轻服务不必要的开销;易维护且能准确识别重放攻击,不需要主动实时地维护清理状态码,且能够根据业务量实现自平衡,达到最优效果;基于时间戳,引入唯一时序码来标记请求,再通过二进制位状态压缩记录接口重复状态来实现;通过以上步骤只需要缓存两组数据,即状态码和最新时序码,将正常请求和疑似问题请求差别化处理,对正常请求接口完成优化加速,并通过二进制压缩状态位左移自动维护状态,无需手动维护,既能完成防重放攻击的效果,也减少内存的开销,同时减轻维护的成本;通过发明的时序码对接口请求拆分为正常请求和疑似异常请求,只对疑似异常请求做状态检测;通过发明的状态码,实现对api接口处理状态进行标记和校验,可以识别出重放攻击的请求,同时不需要对状态位实时维护清理,且能根据业务量实现自动扩容,实现系统的自平衡。
[0047]
以上仅是本发明的优选实施方式,本发明的保护范围并不仅局限于上述实施例,凡属于本发明思路下的技术方案均属于本发明的保护范围。应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理前提下的若干改进和润饰,应视为本发明的保护范围。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1