时间戳通常用于防止重放攻击,但并不能保证每个请求都是一次性的。我今天读了一篇关于如何通过的文章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这意味着只有效一次的随机字符串。该参数要求每个请求不同,因此该参数通常与时间戳有关。为了方便起见,我们直接使用时间戳的16进制系统。在实际使用中,我们可以使用客户端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