时间戳通常用于防止重放攻击,但这并不能保证每个请求都是一次性的。今天看了一篇文章,讲的是如何通过nonce(使用一次的数字)保证一次性有效性。我感觉如果两者结合起来,可以达到非常好的效果。

  重放攻击是计算机世界黑客中常见的攻击方式之一。重放攻击是指攻击者发送目的主机已经收到的数据包来欺骗系统,主要用在认证过程中。

  首先,我们先明确一下,重放攻击是二次请求。黑客通过抓取包得到请求的HTTP消息,然后黑客自己写一个类似的HTTP请求发送给服务器。也就是说服务器处理了两个请求,先是正常的HTTP请求,然后是黑客发来的被篡改的HTTP请求。

  基于时间戳的方案

  每个HTTP请求都需要添加时间戳参数,然后时间戳和其他参数一起进行数字签名。因为一个正常的HTTP请求到达服务器一般不超过60s,服务器收到HTTP请求后,首先判断时间戳参数与当前时间相比是否超过60s,如果超过,则认为是非法请求。

  如果黑客通过抓取包获得我们的请求url:

  在…之中

  $ sign = MD5($uid。$token。$ stime);

  //服务器可以通过uid从数据库中读取token12

  一般来说,黑客从包捕获到重放请求需要远远超过60s的时间,所以请求中的stime参数已经失效。

  如果黑客将stime参数修改为当前时间戳,sign参数对应的数字签名将失效,因为黑客不知道token值,所以没有办法生成新的数字签名。

黑客追款出款收费

  但是,这种方法的脆弱性也是显而易见的。如果60s后进行重放攻击,那就没办法了,所以这种方法不能保证请求只有效一次。

  基于随机数的方案

  Nonce表示只有效一次的随机字符串。要求这个参数在每次请求时都应该是不同的,所以这个参数一般和时间戳有关。为了方便起见,我们直接使用时间戳的十六进制系统。在实际使用中,我们可以对客户端的ip地址、mac地址等信息进行哈希处理,作为nonce参数使用。

  我们将每个请求的nonce参数存储在一个“集合”中,这个集合可以以json格式存储在数据库或缓存中。

  每次处理HTTP请求时,首先判断请求的nonce参数是否在“集合”中,如果存在,则认为是非法请求。

  如果黑客通过抓取包获得我们的请求url:

  在…之中

  $ sign = MD5($uid。$token。$ nonce);

  //服务器可以通过uid从数据库中读取token12

  第一次请求nonce参数时,它已经存储在服务器上的“set”中,重新发送请求将被识别和拒绝。

  nonce参数作为数字签名的一部分,是不能被篡改的,因为黑客不知道令牌,所以不能生成新的签名。

  这种方法还有一个很大的问题,就是存储nonce参数的“集合”会越来越大,验证“集合”中是否存在nonce的时间会越来越长。我们不能让nonce集无限大,所以需要定期清理,但是一旦清理了,就无法验证清理后的nonce参数。也就是说,假设平均每天清理一次“集合”,虽然我们无法重放攻击当时抓取的url,但是我们仍然可以隔天重放攻击。此外,在24小时内存储所有请求的“nonce”参数是一笔不小的开销。

  基于时间戳和随机数的方案

  如果我们同时使用时间戳和nonce参数会怎么样?

  一次性nonce可以解决时间戳参数60s的问题,时间戳可以解决nonce参数“集”越来越大的问题。

  在时间戳方案的基础上,我们增加了nonce参数,因为对于超过60s的请求,timstamp参数被认为是非法的,所以我们只需要存储60s的nonce参数“set”。

  如果黑客通过抓取包获得我们的请求url:

  在…之中

  $ sign = MD5($uid。$token。$stime。$ nonce);

  //服务器可以通过uid从数据库中读取token12

  如果HTTP请求在60s内被重放,那么它将被判定为非法请求,因为在第一次请求时,nonce参数已经被记录在服务器的nonce参数“set”中。超过60秒后,时间参数将失效。此时,无法重新生成签名,因为黑客不知道token的值。

  综上,我们认为一个正常的HTTP请求发送时间不会超过60s,60s以内的重放攻击可以通过nonce参数来保证,超过60s的重放攻击可以通过stime参数来保证。

  因为nonce参数只在60s内有效,所以你只需要保存60s内的nonce参数。

  我们不必每60秒清理一次nonce参数集。我们只需要在新的随机数到达时判断随机数集的最后修改时间。如果超过60秒,我们将清除该集并存储一个新的nonce参数集。实际上,nonce参数集可以存储更长时间,但至少是60s。

  核查进程

  //确定stime参数是否有效。

  如果($now - $stime > 60){

  Die("请求超时");

  }

  //确定nonce参数是否已经存在于“Set”中

  if(in _ array $ nonce,$nonceArray) ){

  Die("请求只有效一次");

  }

  //验证数字签名

  如果($签!= MD5($uid。$token。$stime。$nonce) ){

  Die("数字签名验证失败");

  }

  //确定nonce集合是否需要清理。

  if($ now-$ non cearray--> lastModifyTime > 60){

  $ nonceArray = null

  }

  //记录这个请求的nonce参数。

  $ nonce array . push($ nonce);

  //开始处理合法请求?1234567881111213125

  参考文章:

  http://www . 360 doc . com/content/14/0116/16/834950 _ 345740386 . shtml



黑客追款出款收费
90%的人还看了下面的内容
专门窃取能源与航空航天企业商业机密的黑客(黑客追款出款收费)
专门窃取能源与航空航天企业商业机密的黑客(黑客追款出款收费)
原来中国“黑客”这么厉害(黑客追款出款收费)
原来中国“黑客”这么厉害(黑客追款出款收费)
人工智能会被黑客攻击吗(黑客追款出款收费)
人工智能会被黑客攻击吗(黑客追款出款收费)
常用黑客软件用途分类(黑客追款出款收费)
常用黑客软件用途分类(黑客追款出款收费)