百度百科介绍
重放攻击(Replay Attacks)又称重播攻击、回放攻击,是指攻击者发送一个目的主机已接收过的包,来达到欺骗系统的目的,主要用于身份认证过程,破坏认证的正确性。重放攻击可以由发起者,也可以由拦截并重发该数据的敌方进行。攻击者利用网络监听或者其他方式盗取认证凭据,之后再把它重新发给认证服务器。重放攻击在任何网络通过程中都可能发生,是计算机世界黑客常用的攻击方式之一。
核心概念
1. 防重放的核心在于,防止黑客抓取请求报文,从而进行重播攻击,也就意味我们不能允许客户端,用相同参数,请求第二次。
2. 对应解决方案:客户端传递额外的参数,时间戳、随机数、流水号等,服务端再判断是否为一次请求。
一、基于timestamp解决方案
1.一次正常的http请求,响应时间一般在5s内完成,基本上不会超过60s,我们根据自己接口的响应时间设置阈值
2.客户端每次发起请求,携带当前时间戳
3.服务端接收请求后,我们校验客户端时间戳与服务端时间戳的差值,超过了60s既认为是重播攻击
总结:实现简单有效,但在60s内,黑客仍可实现重播攻击,时间戳最好再加盐处理。
Java代码示例
if((服务器当前时间戳-用户携带的时间戳) > 60){
return "非法请求";
}else{
return "请求成功"
}
二、基于nonce解决方案
1.客户端每次发起请求,都需要携带uuid(要求唯一即可)
2. 服务端接收到请求后,先校验用户携带的uuid是否存在,不存在:将uuid存储到数据库或缓存服务器中,存在:既认为是重播攻击
总结:实现简单有效,但随着请求量越多,存储的数据会越来越大。
Java代码示例
Uuid uuid= UuidMapper.select(uuid);
if(uuid!= null){
return "非法请求";
}else{
UuidMapper.insert(uuid);
return "请求成功"
}
三、基于timestamp和nonce解决方案
总结:结合以上两种方案,并定期清理缓存。
Java代码示例
if((服务器当前时间戳-用户携带的时间戳) > 60){
return "非法请求";
}
if(uuid!= null){
return "非法请求";
}else{
保存uuid并设置缓存失效时间;
return "请求成功"
}