定义为在设计API接口时,一般考虑接口的防篡改攻击和防重放攻击。 有关防篡改攻击的信息,请参见我的另一个博客“Java编程: API接口防篡改、签名和验证原理”。 本文主要介绍如何防范重放攻击。
重放攻击(Replay Attacks ),也称为重放攻击,是攻击者发送目标主机接收到的数据包,以达到欺骗系统的目的,主要用于认证过程,破坏了认证的准确性。 重放攻击既可以由发起方进行,也可以由截获该数据并重新发送的敌人进行。 攻击者利用网络监听等窃取认证证书,并将其重新发送到认证服务器。 任何网络路径都可能发生重放攻击,是计算机全球黑客常用的攻击方法之一。 (来自百度百科)。
例如,用户发起带有支付参数的支付请求,攻击者拦截该请求,然后向服务器重复发送该请求。 如果服务器端没有设置防重放攻击策略,则会多次支付,可能会导致用户丢失。
常见的重放攻击防范策略主要分为以下两类。
1、基于timestamp的方案
2、基于token的方案
3、基于timestamp和token的方案
在基于timestamp的方案中,将timestamp参数添加到请求中以表示请求时间戳。 服务器收到该请求后,根据当前时间生成接收时间戳,根据两个时间戳的差值进行请求判定,如果差值大于指定阈值,则认为请求无效,否则请求通过。 阈值的选择可以根据接口的响应速度进行适当调整,但通常默认为60秒。
伪代码如下所示。
if ()接收时间戳-请求时间戳60 ) )“请求失败”) else )“请求通过”)该计划必须使请求和响应双方保持时间同步,如果服务双方在时间上存在差异,则会影响差分值的计算,结果和
缺点:可以看出,上面的判决逻辑允许在低于阈值的时间段内重复请求,并且不能保证请求只有效一次。
基于token的计划将由指定规则生成的token添加到请求中,以标识请求的唯一性。 服务器收到请求后,首先判断缓存集合中是否存在该token,如果存在,则判断本次请求无效,否则将token放入缓存中,使请求通过。
伪代码如下所示。
将token存在于缓存集合中()“请求失败”(else ) token放入集合的“请求通过”)此方案要求token的生成规则具有唯一性,如果token的值重叠,则正常的请求访问
缺点: token存在于缓存中,没有有效期设置。 随着请求量的增加,缓存集合中的token数量非常庞大,会消耗系统大量的内存。 为了解决这个问题,引入了基于timestamp和token的方案。
基于timestamp和token的方案timestamp解决了token方案中缓存集合数据量大的问题,token解决了timestamp方案中的一次性访问问题。 伪代码如下所示。
接收时间戳-请求时间戳(60秒)“请求失败”(if ) )“请求失败”(else ) token置位,缓存时间60秒“请求通过”)防篡改和防重放攻击接口设计