赞
踩
假设我们有两段数据S和M以及单向散列函数h,其中S是机密信息。我们通过hash=h(S+M)(其中+,表示字符串连接)计算hash值,通过计数数据的hash与原始hash对比来校验数据是否可靠。因为通常攻击者不知道S值。
比如如下字符串(可以看作url的一部分):
key_id=44fefa051fc1c61f5e76f27e620f51d5&perms=read&hash_sig=38d39516d896f879d403bd327a932d9e
hash_si=h(key|perms)
在上面种情形下就存在长度延展攻击,攻击者可以在不知道key的情况下构造出如下字符串:
key_id=44fefa051fc1c61f5e76f27e620f51d5&perms=read\0x80\0x00...\0x02&delete&hash_sig=a8e6b9704f1da6ae779ad481c4c165a3
这是如何做到的呢?
这跟单向散列函数的计算过程密切相关,下图表示单向散列函数的计算过程:
输入数据进过分组,压缩函数接收一个数据分组和上一个压缩函数的运算结果。如果知道了上一个压缩函数的运算结果,我们就能够计算下一个分组数据的压缩函数运算结果。这里,就是出现安全漏洞的地方。
我们把原来的散列值作为压缩函数的一个输入,我们再按照数据补齐规范,去补齐原来数据到数据分组的整数倍,然后加入新的数据,我们就可以计算原数据和扩展数据的散列值了。
但是,如果我们把数据编排顺序换一下,把公开信息 M 放在前面,机密信息 S 放在后面,长度延展攻击就不起作用了。因为我们在重新验证url是否有效时采用的是hash=h(M|S),而再通过上面的方法只能构造hash=h(M|S|N),显然导致hash不匹配。这就是数据编排顺序对数据安全性的影响。
一个单向散列函数如何使用了上述的压缩函数和链接模式,都是长度延展攻击的可以对象。
长度延展攻击完全有效的算法有:
长度延展攻击不是完全有效:
长度延展攻击没有效果:
我们要从中学会、理解一个实用的经验:不要单纯使用单向散列函数来处理既包含机密信息、又包含公开信息的数据。即使我们把机密信息放在最后处理,这种使用方式也不省心。
如果我们需要使用机密数据产生数据的签名,我们应该使用设计好的、经过验证的算法,比如我们后面会讨论的消息验证码(Message Authentication Code)和基于单向散列函数的消息验证码(Hash-based Message Authentication Code)。
单向散列函数是密码学的核心,典型使用单向散列函数的场景有:
校验数据的完整性时,要保证给出的hash值不可更改,这样通过计算数据的hash值与原hash对比才有意义。比如:劫持者篡改了数据,同时计数篡改后数据的hash值并替换原始hash值。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。