JAVA实现防重放攻击和接口签名

防重放攻击参考自:百度百科 和 博客https://blog.csdn.net/yuandeng1024/article/details/98939276

防重放攻击

重放攻击(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. 将参数+时间戳+随机字符串按照某种顺序进行拼接
  2. 通过加密技术进行加密,比如RSA
  3. 将明文和密文都发送到服务端
  4. 在服务端通过key对密文进行解密
  5. 将解密后的数据与明文数据进行比较
  6. 比较结果一致表示没有被篡改,否则表示数据被篡改过
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值