JAVA实现防重放攻击和接⼝签名
⽂章⽬录
防重放攻击
重放攻击(Replay Attacks):攻击者 截取了从A发送给B的⼀个有效请求,然后重新发送给B,这样就获取了B应该返回给A的数据。或发起海量请求使服务器崩溃。
重放攻击的基本原理:把以前窃听到的数据原封不动地重新发送给接收⽅。很多时候,⽹络上传输的数据是加密过的,此时窃听者⽆法得到数据的准确意义。但如果他知道这些数据的作⽤,就可以在不知道数据内容的情况下通过再次发送这些数据达到愚弄接收端的⽬的。例如,有的系统会将鉴别信息进⾏简单加密后进⾏传输,这时攻击者虽然⽆法窃听密码,但他们却可以⾸先截取加密后的⼝令然后将其重放,从⽽利⽤这种⽅式进⾏有效的攻击。再⽐如,假设⽹上存款系统中,⼀条消息表⽰⽤户⽀取了⼀笔存款,攻击者完全可以多次发送这条消息⽽偷窃存款(百度百科)
常⽤的防⽌重放攻击策略主要分为以下⼏种:
基于 加时间戳的⽅案:在请求中增加时间戳参数要来表⽰请求时间戳,服务⽅端接收该请求后,根据当前时间⽣成⼀个接收时间戳,然后根据两个时间戳的差值进⾏请求判定,如果差值⼤于指定的阈值,则
认为请求⽆效,否则请求通过。关于阈值的选定,可以根据接⼝的响应速度进⾏适当的调整,⼀般默认为 60 秒。缺点:通过上⾯的判定逻辑可以发现,在⼩于阈值的时间段内是可以进⾏重复请求的,该⽅案不能保证请求仅⼀次有效。
基于 token 的⽅案:在请求中增加⼀个通过指定规则产⽣的 token,标识请求的唯⼀性,服务⽅接收该请求后,先判断缓存集合中是否存在该 token,如果存在则认为此次请求⽆效,否则将 token 放⼊缓存中,通过请求通过。缺点:token 存在于缓存中,⽽且没有有效期设置,随着请求量的增加,缓存集合中 token 的数量会⾮常庞⼤,会占⽤系统的⼤量内存。
基于 时间戳和 token 的⽅案:时间戳解决 token ⽅案中缓存集合数据量⼤的问题,token 解决 时间戳⽅案中⼀次性访问的问题。
现在⼀般都是采⽤第三种⽅案,这⾥也采⽤第三种 基于 时间戳和 token 的⽅案,逻辑代码如下:
if((接收时间戳-请求时间戳)>60秒){
"请求失败"
}
if(token 存在于缓存集合中){
"请求失败"
}else{
将 token 放⼊集合中,缓存时间60秒
"请求通过"
}
在上⾯我们队请求进⾏了出来,来防⽌重放攻击,但是当攻击者可以通过对请求数据的修改,来规避我们的这些规则,因此我们就需要添加接⼝签名功能,来防⽌数据被篡改。
接⼝签名
接⼝签名实现流程:
1. 将参数+时间戳+随机字符串按照某种顺序进⾏拼接
java技术介绍百度百科2. 通过加密技术进⾏加密,⽐如RSA
3. 将明⽂和密⽂都发送到服务端
4. 在服务端通过key对密⽂进⾏解密
5. 将解密后的数据与明⽂数据进⾏⽐较
6. ⽐较结果⼀致表⽰没有被篡改,否则表⽰数据被篡改过
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论