Java编程:API接⼝防⽌重放攻击(重复攻击)
定义
我们在进⾏ API 接⼝设计时,⼀般都要考虑接⼝的防⽌篡改攻击和防⽌重放攻击。防篡改攻击请参考我的另⼀篇博客:,本篇⽂章主要介绍防⽌重放攻击。
重放攻击(Replay Attacks)⼜称重播攻击、回放攻击,是指攻击者发送⼀个⽬的主机已接收过的包,来达到欺骗系统的⽬的,主要⽤于⾝份认证过程,破坏认证的正确性。重放攻击可以由发起者,也可以由拦截并重发该数据的敌⽅进⾏。攻击者利⽤⽹络监听或者其他⽅式盗取认证凭据,之后再把它重新发给认证服务器。重放攻击在任何⽹络通过程中都可能发⽣,是计算机世界⿊客常⽤的攻击⽅式之⼀。(来⾃百度百科)
举个例⼦,⽤户发起⼀个付款请求,请求中带着付款参数,攻击者拦截了该请求,向服务器重复的发送该请求,如果服务器端没有配置防⽌重放攻击策略,则可能会进⾏多次付款,造成⽤户损失。
常⽤的防⽌重放攻击策略主要分为以下两种:
1、基于 timestamp 的⽅案
2、基于 token 的⽅案
3、基于 timestamp 和 token 的⽅案
基于 timestamp 的⽅案
在请求中增加 timestamp 参数要来表⽰请求时间戳,服务⽅端接收该请求后,根据当前时间⽣成⼀个接收时间戳,然后根据两个时间戳的差值进⾏请求判定,如果差值⼤于指定的阈值,则认为请求⽆效,否则请求通过。关于阈值的选定,可以根据接⼝的响应速度进⾏适当的调整,⼀般默认为 60 秒。
伪代码如下:
if((接收时间戳-请求时间戳) > 60){
"请求失败"
} else {
"请求通过"
}
该⽅案要求请求和响应的双⽅必须进⾏时间同步,如果服务的双⽅本⾝存在时间上的差异,会对差值
的计算产⽣影响,最后导致请求的判定产⽣偏差。
缺点:通过上⾯的判定逻辑可以发现,在⼩于阈值的时间段内是可以进⾏重复请求的,该⽅案不能保证请求仅⼀次有效。
基于 token 的⽅案
java技术介绍百度百科在请求中增加⼀个通过指定规则产⽣的 token,标识请求的唯⼀性,服务⽅接收该请求后,先判断缓存集合中是否存在该 token,如果存在则认为此次请求⽆效,否则将 token 放⼊缓存中,通过请求通过。
伪代码如下:
if(token 存在于缓存集合中){
"请求失败"
} else {
将 token 放⼊集合中
"请求通过"
}
该⽅案要求 token 的⽣成规则要保证唯⼀性,如果 token 值重复,则会影响正常的请求访问。
缺点:token 存在于缓存中,⽽且没有有效期设置,随着请求量的增加,缓存集合中 token 的数量会⾮常庞⼤,会占⽤系统的⼤量内存。为了解决这个问题,我们引⼊了基于 timestamp 和 token 的⽅案。
基于 timestamp 和 token 的⽅案
timestamp 解决 token ⽅案中缓存集合数据量⼤的问题,token 解决 timestamp ⽅案中⼀次性访问的问题。伪代码如下:
if((接收时间戳-请求时间戳) > 60秒){
"请求失败"
}
if(token 存在于缓存集合中){
"请求失败"
} else {
将 token 放⼊集合中,缓存时间60秒
"请求通过"
}
防⽌篡改攻击与防⽌重放攻击是接⼝设计的基本要求,⽂章内容仅代表个⼈观点,如有不正之处,欢迎批评指正,谢谢⼤家。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。