时间戳通常用于防止重放攻击,但这并不能保证每个请求都是一次性的。今天看了一篇文章,讲的是如何通过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
注:本文由黑客联盟整理编辑,转载请注明来源地址:基于timestamp的防止重放攻击方案(黑客追款出款收费)http://www.556z.cn/hkzk/672.html
版权声明:本文内容来源于互联网,由站长整理发布,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件举报,一经查实,本站将立刻删除。