赞
踩
重放攻击(Replay Attacks)又称为重播攻击、回放攻击,一般是攻击者截获数据包后,无法解密数据,但可以把数据包和业务间的关系进行猜测,重新发送相同数据包,来达到欺骗系统的目的,主要用于身份认证过程、破坏认证的正确性。
重放攻击可以由发起者、或拦截方进行。拦截方进行的重放攻击又称为中间人攻击。
重放攻击基于网络嗅探。很多时候嗅探到的数据是加密过的,但攻击者虽然无法解密,但如果攻击者知道数据的意义,就可以发送这些数据来愚弄接收端。
在物联网场景中,攻击者可以利用这种攻击控制用户的设备。
根据重放消息的接收方与消息的原定接收方的关系,重放攻击可分为3种:
nonce是仅一次有效的随机字符串,一般可以使用时间戳和客户端其它唯一性参数进行哈希运算。
优点:认证双方不需要时间同步,双方记住使用过的随机数,如果报文中有以前使用过的随机数,认为是重放攻击。
缺点:需要额外保存使用过的随机数,需要保存和查询开销,服务器端存放hash值的库会越来越大,要进行定期清理。定期清理后重放攻击也许会生效。
优点:不需要额外保存信息
缺点:双方需要准确的时间同步,同步越好,受攻击的可能性越小。对于分布式的分布,同步精确的时间并不容易。
双方在报文中添加一个逐步递增的整数,只要接收到一个不连续的流水号报文(太大或太小),就认定有重放威胁。
优点:不需要时间同步,保存的信息量小
缺点:攻击者如果对报文解密成功,就可以获得流水号,从而伪造数据。
对于web或socket通讯,加上SSL/TLS 可以有效防止基于中间人的重放攻击。
实际应用中常将1、2组合使用,保存某个时间段内的所有随机数,而且时间戳的同步也不需要太精确。
验证流程(PHP代码示例):
//判断stime参数是否有效 if( $now - $stime > 60){ die("请求超时"); } //判断nonce参数是否在“集合”已存在 if( in_array($nonce,$nonceArray) ){ die("请求仅一次有效"); } //验证数字签名 if ( $sign != md5($uid.$token.$stime.$nonce) ){ die("数字签名验证失败"); } //判断是否需要清理nonce集合 if( $now - $nonceArray->lastModifyTime > 60 ){ $nonceArray = null; } //记录本次请求的nonce参数 $nonceArray.push($nonce); //开始处理合法的请求
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。