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

Posted 志波同学

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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秒
	"请求通过"


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

以上是关于Java编程:API接口防止重放攻击(重复攻击)的主要内容,如果未能解决你的问题,请参考以下文章

API接口防止参数篡改和重放攻击

如何有效防止API的重放攻击(转自阿里云)

API接口如何防止参数被篡改和重放攻击?

HTTPS如何防止重放攻击?

重放攻击

防止重放攻击最有效的方法是