长度延展攻击【密码学】(三)

一、什么是长度延展

假设有两段数据,S和M,以及一个单向散列函数h。

如果我们要将两段数据合并起来,并且还要计算合并后的散列值,这就叫做单向散列函数的长度延展。

 二、长度延展攻击

如果S和M都是公开信息,那么S在前还是M在前是不重要的。

但如果S是机密信息,M是公开信息,S放在前面就存在“长度延展攻击”的风险。

长度延展攻击:可以利用已知数据的散列值,计算原数据外加一段延展后的散列值。

也就是说,如果我们知道了h(S|M)我们就可以计算h(S|M|N)。其中,数据N就是原数据追加的延展数据。

如果S和M都是公开的信息,那么能计算延展数据的散列值也没什么要紧的。

但如果S是机密数据,它的用途就和机密有点关系。因为没有人知道我拥有的机密数据,所以,当我给定一段公开信息M后,只有我自己能计算S和M的散列值。

通过验证S和M的散列值,就知道一个给定的散列值是我计算、派发出去的、还是别人伪造的。

机密数据放前面,就会存在“长度延展攻击”的风险,攻击者不需要知道机密数据,就可以通过一个已知的URL,构造一个新的合法的URL,也就是说,攻击者可以伪造一个合法的散列值。

攻击者如何伪造?

前面我们提到,一个单向散列函数,应该由四个部分组成:数据分组,压缩函数,链接模式,终结函数。

长度延展攻击【密码学】(三)_第1张图片

长度延展攻击【密码学】(三)_第2张图片

压缩函数接收一个数据分组和上一个压缩函数的运算结果。如果知道了上一个压缩函数的运算结果,我们就能够计算下一个分组数据的压缩函数运算结果。这里,就是出现安全漏洞的地方。

不要单纯使用单向散列函数来处理既包含机密信息、又包含公开信息的数据。即使我们把机密信息放在最后处理,这种使用方式也不省心。


如果我们需要使用机密数据产生数据的签名,我们应该使用设计好的、经过验证的算法。


另外,如果需要设计算法,我们还要理解另外一个实用的原则:算法要皮实、耐用,不能有意无意地用错了就有安全漏洞。

你可能感兴趣的:(密码学,密码学)