重放攻击的解决方案.pdf
重放攻击的解决方案重放攻击的解决方案一、重放攻击的定义重放攻击就是攻击者利用网络监听或者其他方式盗取认证凭据发送一个目的主机已接收过的包,来达到欺骗系统的目的,主要用于身份认证过程。重放攻击任何网络通讯过程中都可能发生。如下图所示,如果 alice 向 bob 发送已经加密或者经过散列的消息,bob 通过这个消息来验证 alice 的身份,这样如果中间的消息被man in the iddle 截获的话,也向bob 发送同样的消息,这样 bob 也会认为 man in the middle就是 alice,这样就形成了欺骗。alice二、散列函数能够解决重放攻击?如果是静态的密码进行散列的话,是肯定不能防止重放攻击的,这是因为,alice 每次的验证消息都是一样的,就如同上图,一旦被截获,直接就能欺骗bob。三、解决办法:1,基于时间戳这个方法实现的前提是服务器的时间必须和用户的时间保持同步,在同一个时间,服务hello alice!截获hello alice!hello bob!bobman in the middle“alice”重新发送验证消息hello bob!器和用户每隔一段时间就会更改自己的密码,用户输入登录之后,一段时间后密码就会改变,这样就能够防止重放攻击,时间窗口越小越保险。举个例子:网易的将军令,就是一个基于时间戳的密保工具,他是每隔 60s 密码就会更改一次,有效的保护了玩家的帐号。登录界面如下:2,基于挑战值“Challenge-Response”挑战应答方式用户系统-申请登陆-发送挑战值-计算相应的应答值-发送应答值-判断应答值是否正确-通过认证(正确)不正确断开连接这中间用到的算法是HMAC 算法HMAC 需要一个加密用散列函数(表示为H,可以是MD5 或者 SHA-1)和一个密钥K.我们用 B 来表示数据块的字节数。(用 L 来表示散列函数的输出数据字节数(MD5 中 L=16,SHA1 中 L=20)。鉴别密钥的长度可以是小于等于数据块字长的任何正整数值。应用程序中使用的密钥长度若是比B 大,则首先用使用散列函数H 作用于它,然后用 H 输出的 L 长度字符串作为在 HMAC 中实际使用的密钥。一般情况下,推荐的最小密钥 K 长度是 L 个字节。我们将定义两个固定且不同的字符串ipad,opad:(i,o标志内部与外部)ipad=the byte 0 x36 重复 B 次opad=the byte 0 x5C 重复 B 次.计算text的 HMAC:HMAC H(K XOR opad,H(K XOR ipad,text))最后将 HMAC 作为应答返回给服务器。它的具体使用方法是这样的:1。客户端发出登录请求(假设是浏览器的GET 请求)2。服务器返回一个随机值,并在会话中记录这个随机值3。客户端将该随机值作为密钥(K),用户密码(text)进行 hmac 运算,然后提交给服务器4。服务器读取用户数据库中的用户密码和步骤 2 中发送的随机值做与客户端一样的hmac 运算,然后与用户发送的结果比较,如果结果一致则验证用户合法在这个过程中,可能遭到安全攻击的是服务器发送的随机值和用户发送的hmac 结果,而对于截获了这两个值的黑客而言这两个值是没有意义的,绝无获取用户密码的可能性,随机值的引入使 hmac 只在当前会话中有效,大大增强了安全性和实用性.