何时可以安全使用破碎的散列函数?

使用像SHA-256这样的安全散列函数是微不足道的,并且继续使用MD5进行安全性是鲁莽行为。 但是,我希望更好地理解散列函数漏洞的一些复杂性。

已经为MD4和MD5产生了冲突。 根据NIST的说法,MD5不是一个安全的散列函数。 它只需要239次操作来产生冲突,不应该用于密码。 然而,SHA-1容易遭受类似的碰撞攻击,其中在269次操作中可发现碰撞,而强力为280次。没有人产生SHA-1冲突,并且NIST仍将SHA-1列为安全消息摘要函数。

那么何时使用破碎的散列函数是安全的? 即使功能被破坏,它仍然可以“足够大”。 根据Schneier的说法,一个容易受到冲突攻击的散列函数仍然可以用作HMAC。 我相信这是因为HMAC的安全性取决于它的秘密密钥,并且直到获得这个密钥才能找到碰撞。 一旦你在HMAC中使用密钥,它已经被破解了,所以这是一个有争议的问题。 什么散列函数漏洞会破坏HMAC的安全性?

让我们再来看看这个属性。 如果在密码前加了一个salt,那么它是否可以安全地使用像MD4这样非常弱的消息摘要作为密码? 请记住,MD4和MD5攻击是攻击的前缀,并且如果salt被预先攻击,则攻击者无法控制消息的前缀。 如果盐真的是一个秘密,并且不被攻击者知道,那么它是否附加到密码上会有影响吗? 假设攻击者在获得整个消息之前不能产生冲突是否安全?

您是否知道其他情况下可以在安全上下文中使用破碎的哈希函数而不引入漏洞?

(请张贴证据,因为它太棒了!)


实际上,碰撞比您在MD5和SHA-1上列出的更容易。 在相当于226.5操作的时间内可以找到MD5冲突(其中一个“操作”是通过短消息计算MD5)。 看到这个页面的一些细节和攻击的实现(我写了那个代码;它在64位模式下在2.4 GHz Core2 x86上平均发现了一次冲突)。

同样,对SHA-1的最为人所知的攻击大约在261次操作中,而不是269次。它仍然是理论上的(尚未产生实际的碰撞),但它处于可行的范围之内。

至于对安全性的影响:散列函数通常被认为有三个属性:

  • 没有preimage:给定y,找到x使得h(x)= y应该是不可行的。
  • 没有第二个原像:给定x1,找到x2(不同于x1)应该是不可行的,使得h(x1)= h(x2)。
  • 没有碰撞:找到任何x1和x2(彼此不同)使得h(x1)= h(x2)不应该是可行的。
  • 对于具有n位输出的散列函数,在2n个操作中对于两个第一属性存在通用攻击(其不管散列函数的细节如何工作),对于第三个属性存在2n / 2个操作。 如果对于给定的散列函数发现攻击,其通过利用散列函数如何操作的特定细节,发现比相应的一般攻击更快的前像,第二预像或冲突,则散列函数被称为被“破碎”。

    然而,并不是所有散列函数的用法都依赖于这三个属性。 例如,数字签名首先对要签名的数据进行散列,然后在算法的其余部分使用散列值。 这依赖于对preimages和第二preimages的抵制,但数字签名本身不会受到冲突的影响。 在某些特定签名方案中,碰撞可能是一个问题,攻击者可以选择要由受害者签名的数据(基本上,攻击者计算碰撞,受害者签署一条消息,签名变为有效另一个消息)。 这可以通过在计算签名(在X.509证书背景下演示的攻击和解决方案)之前向签名消息添加一些随机字节来抵消。

    HMAC安全性依赖于散列函数必须满足的其他属性; 即“压缩函数”(构建散列函数的基本块)充当伪随机函数(PRF)。 有关PRF的详细信息非常具有技术性,但粗略地说,PRF应与Random Oracle无法区分。 随机预言模型是一个黑盒子,其中包含一个侏儒,一些骰子和一本大书。 在某些输入数据上,gnome选择一个随机输出(用骰子),并在书中记录输入消息和随机选择的输出。 侏儒使用本书来检查他是否已经看到相同的输入消息:如果是这样,那么gnome返回的输出与以前相同。 通过构建,你可以不知道任何关于给定消息上的随机预言的输出,直到你尝试它。

    随机预言模型允许在调用PRF时量化HMAC安全证明。 基本上,证明指出,如果没有调用PRF很多次,HMAC就不能被破坏,而“巨大”我的意思是在计算上不可行。

    不幸的是,我们没有随机的神谕,所以在实践中我们必须使用散列函数。 没有证据证明散列函数真的存在,PRF属性; 现在,我们只有候选人,即我们无法证明他们的压缩函数不是PRF的函数。

    如果压缩函数是PRF,那么散列函数会自动抵抗冲突。 这是PRF魔法的一部分。 因此,如果我们可以找到散列函数的冲突,那么我们知道内部压缩函数不是PRF。 这不会将冲突转化为对HMAC的攻击。 能够随意产生冲突并不能帮助打破HMAC。 但是,这些冲突表明与HMAC相关的安全性证明不适用。 保证是无效的。 这与笔记本电脑相同:打开机箱并不一定会破坏机器,但事后您是靠自己的。

    在Kim-Biryukov-Preneel-Hong的文章中,介绍了对HMAC的一些攻击,特别是对HMAC-MD4的伪造攻击。 这次攻击利用了MD4(它的“弱点”)的缺点,使其成为非PRF。 使用相同弱点的变种在MD4上产生冲突(MD4被彻底打破;一些攻击产生的冲突比散列函数本身的计算更快!)。 所以这些冲突并不意味着HMAC攻击,但是这两种攻击都是在同一个源上进行的。 但是,请注意,伪造攻击的成本为258,这非常高(没有实际伪造产生,结果仍然是理论上的),但是大大低于HMAC期望的抵抗水平(具有强劲的散列函数和n位输出,HMAC应该抵抗高达2n的工作因素;对于MD4,n = 128)。

    所以,虽然碰撞本身并不意味着HMAC的弱点,但它们是坏消息。 在实践中,碰撞是很少设置的问题。 但了解冲突是否影响给定的散列函数的使用是非常棘手的,因此继续使用散列函数来展示冲突是非常不明智的。

    对于SHA-1,攻击仍然是理论上的,并且SHA-1被广泛部署。 情况如此描述:“警报已经开始,但没有明显的火灾或烟雾,现在是走向出口的时候了 - 但不能跑。”

    有关该主题的更多信息,请阅读由Menezes,van Oorschot和Vanstone撰写的应用密码学手册第9章,这是一本必读的学徒密码学家(不要与B. Schneier的“Applied Cryptography”混淆,这是一本写得很好的介绍,但不像“手册”那样彻底)。


    唯一可以安全使用破碎哈希函数的时间是碰撞的后果是无害的或微不足道的,例如,将文件分配给文件系统中的存储桶时。


    当你不在乎它是否安全。

    严重的是,它几乎不用任何额外的努力在几乎所有的语言中使用安全的哈希函数,性能影响可以忽略不计,所以我不明白为什么你不会这么做。

    [实际阅读你的问题后编辑]

    根据Schneier的说法,容易受到collsion攻击的散列函数仍然可以用作HMAC。 我相信这是因为HMAC的安全性取决于它的秘密密钥,并且直到获得这个密钥才能找到碰撞。

    实际上,这基本上是因为能够为散列生成冲突并不一定能帮助您生成散列散列(与HMAC使用的XORing结合)的冲突。

    如果密码中含有盐分,那么是否可以安全地使用非常微弱的信息摘要,例如md4作为密码?

    不,如果散列有一个preimage攻击,它允许您将数据前置到输入。 例如,如果散列是H(pass + salt) ,我们需要一个preimage攻击,它允许我们找到pass2,使得H(pass2 + salt) = H(pass + salt)

    过去有追加攻击,所以我敢肯定预先攻击是可能的。

    链接地址: http://www.djcxy.com/p/21569.html

    上一篇: When is it safe to use a broken hash function?

    下一篇: SHA512 vs. Blowfish and Bcrypt