Web安全防范-----防止重放攻击

1、什么是重放攻击?

咱们在开发接口的时候一般会考虑接口的安全性,好比说咱们一般会要求请求的url携带一个通过算法加密的签名sign到服务端进行验证,若是验证经过,证实请求是合法的。好比如下的url:redis

http://wokao66.com/in.json?uid=7&sign=xxxxx算法

其中sign的经常使用加密算法为MD5MD5算法是一种不可逆算法,也就是说你加密以后就不能解密了。这一般要求通信双方约定好一个私钥appSecret,这个私钥是约定好的,不能在网络上进行传输。但单单有这个加密是远远不够的,好比说我是一名黑客,我抓包了你当前执行成功的请求信息,咱们假设为request-1,既然你都执行成功了,也就是说你的此次请求的全部参数都是合法的,那么做为黑客的我,我就想能不能将你request-1的请求数据再封装成另一个请求request-2,而后再去请求接口,若是此时系统未做任何处理,那么系统确定是认为request-2是合法的,确定仍是会放行,但至于业务上成不成功,那么是另一个问题了,假若在执行业务前须要进行一个相对耗时的数据库操做,那么大量的request-2,request-3势必会使服务器瘫痪。数据库

酱紫,可能语言难以理解,我画个图先:json

首先正常的请求系统会要求校验,当你的合法请求被黑客拦截以后,黑客就会重复地发送该合法请求,从而达到欺骗系统的目的!这种重复利用合法请求进行攻击成为重放。缓存

2、如何防止重放攻击?

重放攻击的原理其实很简单,无非就是系统没有对合法请求进行惟一性校验。什么意思呢?就是说系统要知道你第一次的合法请求request-1不能被重复执行,要保证每次请求的惟一性。那么怎么去防止重放攻击呢?安全

参考网络上的解决方案,大概有如下两种方式:服务器

  • 一、采用时间戳

这种方式的作法就是,首先咱们认为一次HTTP请求从发出到到达服务器的时间是不会超过60s的,当你发送一个请求时必须携带一个时间戳timestamp,假设值为10,当请求到达服务器以后,服务器会取出当前时间,假设为t2=80,很明显t2-timestamp>60s,那么服务器就认为请求不合法。网络

号外号外,这个时间戳是须要加入MD5加密签名的,否则黑客修改了时间戳t2=20,那不就是白费功夫了。app

为何这样作有效?运维

首先黑客从抓包到发起请求通常会超过60s,再者咱们不需担忧黑客修改了时间戳timestamp,由于若是修改了时间戳,那么对应的签名sign也就失效了,由于MD5是不可逆的,你想伪造MD5,必须知道双方约定的密钥appSecret

缺点:

  1. 若是黑客在60s内发起攻击,那么咱们就一筹莫展了。
  • 二、采用时间戳 + 随机数nonce

上面说到时间戳是有缺点的,那么咱们加入一个随机数nonce,每次成功请求,服务器会保存当前成功请求的随机数nonce,好比存放在redis和数据库中,当请求再次进到服务器,先验证时间戳是否有效,若是有效,再判断携带的随机数nonce是否在缓存或者数据库中已经存在,若是存在,则认为请求非法。

但你会发现,若是系统请求很是多,这个存放nonce的缓存也好,数据库也好势必会愈来愈大,那么咱们只须要保存服务器当前时间60秒内的nonce值便可。

缺点:

  1. 你得保证随机数nonce绝对惟一
  • 三、基于record的方案

什么是基于record的验证方式呢?就是说我如今不须要随机数,我利用MD5加密的惟一性,采用多维度(多个字段),将每次请求的记录保存到数据库中,每次请求先校验签名记录是否存在,若是存在,则认为请求非法,不存在,则将MD5签名结合其余参数一块儿保存到数据库中。固然这里也能够结合时间戳只保存60s内的数据。

第三点主要是不考虑采用随机数机制,同时对本身业务能够有不一样的扩展,或者说加入业务参数方便运维监控等。

综合上面几种方案,都有缺点,其中一个致命的缺点是服务器的时间和客户端的时间是存在时间差的,固然你也能够经过校验时间戳解决此问题。

谢谢阅读。

相关文章
相关标签/搜索