Java编程:API接口防止重放攻击(重复攻击)

定义

我们在进行 API 接口设计时,一般都要考虑接口的防止篡改攻击和防止重放攻击。防篡改攻击请参考我的另一篇博客:Java编程:API接口防篡改、签名、验签原理,本篇文章主要介绍防止重放攻击。

重放攻击(Replay Attacks)又称重播攻击、回放攻击,是指攻击者发送一个目的主机已接收过的包,来达到欺骗系统的目的,主要用于身份认证过程,破坏认证的正确性。重放攻击可以由发起者,也可以由拦截并重发该数据的敌方进行。攻击者利用网络监听或者其他方式盗取认证凭据,之后再把它重新发给认证服务器。重放攻击在任何网络通过程中都可能发生,是计算机世界黑客常用的攻击方式之一。(来自百度百科)

举个例子,用户发起一个付款请求,请求中带着付款参数,攻击者拦截了该请求,向服务器重复的发送该请求,如果服务器端没有配置防止重放攻击策略,则可能会进行多次付款,造成用户损失。

常用的防止重放攻击策略主要分为以下两种:
1、基于 timestamp 的方案
2、基于 token 的方案
3、基于 timestamp 和 token 的方案

基于 timestamp 的方案

在请求中增加 timestamp 参数要来表示请求时间戳,服务方端接收该请求后,根据当前时间生成一个接收时间戳,然后根据两个时间戳的差值进行请求判定,如果差值大于指定的阈值,则认为请求无效,否则请求通过。关于阈值的选定,可以根据接口的响应速度进行适当的调整,一般默认为 60 秒。

伪代码如下:

if((接收时间戳-请求时间戳) > 60){
	"请求失败"
} else {
	"请求通过"
}

该方案要求请求和响应的双方必须进行时间同步,如果服务的双方本身存在时间上的差异,会对差值的计算产生影响,最后导致请求的判定产生偏差。

缺点:通过上面的判定逻辑可以发现,在小于阈值的时间段内是可以进行重复请求的,该方案不能保证请求仅一次有效。

基于 token 的方案

在请求中增加一个通过指定规则产生的 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秒
	"请求通过"
}

防止篡改攻击与防止重放攻击是接口设计的基本要求,文章内容仅代表个人观点,如有不正之处,欢迎批评指正,谢谢大家。

评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值