java编程:api接口防止重放攻击(重复攻击)(代码片段)

志波同学 志波同学     2022-12-05     152

关键词:

定义

我们在进行 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秒
	"请求通过"


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

重放攻击(replyattacks)

...而达到认证通过的目的。我们可以通过加密,签名的方式防止信息泄露,会话被劫持修改。但这种方式防止不了重放攻击。3.重放攻击的防御1 查看详情

重放攻击(replayattacks)

...而达到认证通过的目的。我们可以通过加密,签名的方式防止信息泄露,会话被劫持修改。但这种方式防止不了重放攻击。3.重放攻击的防御1)时间戳验证请求时加上客户端当前时间戳 查看详情

重放攻击(replayattacks)

...而达到认证通过的目的。我们可以通过加密,签名的方式防止信息泄露,会话被劫持修改。但这种方式防止不了重放攻击。3.重放攻击的防御1)时间戳验证请求时加上客户端当前时间戳 查看详情

重放攻击

...而达到认证通过的目的。我们可以通过加密,签名的方式防止信息泄露,会话被劫持修改。但这种方式防止不了重放攻击。3.重放攻击的防御1)时间戳验证请求时加上客户端当前时间戳,同时签名(签名是为了防止会话被劫持,... 查看详情

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

防止重放攻击的最有效的方法是使用一个时间戳和会话密钥,每次传输数据时,发送一个由时间戳和会话密钥组成的哈希值来标识这次传输。然后在接收方检查这个哈希值,当重放攻击发生时,它们接收到的哈希值将与最初传输... 查看详情

.net添加时间戳防止重放攻击

如过客户端在向服务端接口进行请求,如果请求信息进行了加密处理,被第三方截取到请求包,虽然第三方无法解密获取其中的数据,但是可以使用该请求包进行重复的请求操作。如果服务端不进行防重放攻击,就会参数服务器... 查看详情

重放攻击-实例解析

...击?         二,怎么样防止重放攻击?一,重放攻击:顾名思义,重:再次放的意思。主机A要给主机B发送报文,中间重放攻击的主人可以是A,或者是攻击者C:当是A时,表示A会重复发送相同的... 查看详情

重放攻击

...到认证通过的目的。  我们可以通过加密,签名的方式防止信息泄露,会话被劫持修改。但这种方式防止不了重放攻击。 重放攻击的防御(保证请求一次有效):  HTTPS连接过程(https协议就是http+ssl协议): &nb... 查看详情

摘要式身份验证如何防止重放攻击?

】摘要式身份验证如何防止重放攻击?【英文标题】:Howdoesdigestauthenticationpreventsreplayattacks?【发布时间】:2010-10-2709:29:50【问题描述】:我在***上发现了很多关于摘要式身份验证的问题。我找不到摘要身份验证如何防止重放攻... 查看详情

防止重放攻击 appStoreReceiptURL 应用收据

】防止重放攻击appStoreReceiptURL应用收据【英文标题】:PreventreplayattacksappStoreReceiptURLappreceipts【发布时间】:2018-09-2622:54:49【问题描述】:我们有一项服务器端服务,我们只想向付费iOS应用的有效用户提供该服务。(请注意,这... 查看详情

时间戳如何帮助防止 Web 服务中的重放攻击

】时间戳如何帮助防止Web服务中的重放攻击【英文标题】:HowdoesTimestamphelpsinpreventingReplayAttacksinwebservices【发布时间】:2012-04-1819:21:18【问题描述】:我正在尝试理解Web服务中请求标头中时间戳的概念,但不知何故仍然无法完全... 查看详情

如何防止 PHP、csrf、xsrf 中的表单重放/中间人攻击

】如何防止PHP、csrf、xsrf中的表单重放/中间人攻击【英文标题】:Howtopreventformreplay/man-in-the-middleattackinPHP,csrf,xsrf【发布时间】:2010-12-0510:20:13【问题描述】:我有一个网络表单,我正在使用PHP。我知道表单可以被操纵(我相信... 查看详情

在 HTTP 连接中使用基于令牌的身份验证时如何防止重放攻击

】在HTTP连接中使用基于令牌的身份验证时如何防止重放攻击【英文标题】:HowtopreventreplayattackswhenusingtokenbasedauthentificationinanHTTPconnection【发布时间】:2017-09-0518:32:16【问题描述】:在使用基于令牌的身份验证(例如:JSONWeb身份... 查看详情

https如何防止重放攻击?

参考技术A客户端拼接字符串规则如下:接口+参数+时间戳+secretID(如果不是做对外开放性的API,是内部产品调用的话那么secretID可以是写死的一个ID值)将以上字符串用对称加密,作为一个sign参数,请求服务端。比如接口,login... 查看详情

burpsuite重放攻击

 1、重放攻击   重放攻击(ReplayAttacks)又称重播攻击、回放攻击或新鲜性攻击(FreshnessAttacks),是指攻击者发送一个目的主机已接收过的包,来达到欺骗系统的目的,主要用于身份认证过程,破坏认证的正确性。它是... 查看详情

burpsuite实现重放攻击

 1、重放攻击   重放攻击(ReplayAttacks)又称重播攻击、回放攻击或新鲜性攻击(FreshnessAttacks),是指攻击者发送一个目的主机已接收过的包,来达到欺骗系统的目的,主要用于身份认证过程,破坏认证的正确性。它是... 查看详情

利用burpsuite实现重放攻击

1.什么是重放攻击?顾名思义,重复的会话请求就是重放攻击。可能是因为用户重复发起请求,也可能是因为请求被攻击者获取,然后重新发给服务器。附上详细的解释:http://blog.csdn.net/kiritow/article/details/51811844(参考例子)2.安... 查看详情

身份认证防止重放攻击的challenge-response方法

或者叫询问-应答机制。基于挑战/应答(Challenge/Response)方式的身份认证系统就是每次认证时认证服务器端都给客户端发送一个不同的"挑战"字串,客户端程序收到这个"挑战"字串后,做出相应的"应答",以此机制而研制的系统.认... 查看详情