使用多个哈希算法的串联是否更安全?

信息安全 哈希
2021-08-09 06:31:06

在实践中使用多个哈希算法的输出而不是单个算法的输出是否更安全(假设输出大小相同)?

在这种情况下,我所说的安全是指防止碰撞和功能可逆性。

一个特定的示例是使用来自 SHA-512 的 128 位加上来自 MD5 的 128 位,而不是使用来自 SHA-512 的 256 位。

我的直觉是,从理论上讲,这会削弱函数,因为已知的针对 MD5 的攻击会有效地减少组合函数的输出大小。然而,在实践中,是否更难同时找到两种算法的碰撞/反转-因为它会涉及额外的理论工作,而不是使用现有(或即将发布的)已发布的

编辑:

澄清一下,我只是询问不可逆性和抗碰撞性的基本属性——而不是关于哈希函数的任何特定用途,例如从密码中派生密钥(在其他问题中有很好的介绍)或使用输出作为唯一标识符.

另一种表达方式是“将哈希函数定义为其他两个哈希函数的串联是否比那些更好?”。另外,我(有点)意识到,理论上的信息,它不可能。

3个回答

您没有提及您使用哈希的目的,但您的意图似乎是使用 if 进行密码验证。

因此,首先要解决的问题是,可能会发现给定算法容易受到冲突的影响。冲突不会对密码哈希构成威胁,即使算法容易受到冲突影响,也不会出于密码哈希的目的而削弱它。对于密码散列,我们担心的是原像攻击......能够找到用于创建给定散列的输入。

今天,攻击密码哈希的主要机制是基于字典的暴力攻击。您尽可能快地对尽可能多的输入进行散列,以确定哪些输入导致您尝试匹配的散列。因此,密码散列函数最理想的特性是速度慢。您希望确保攻击者花费尽可能长的时间来测试找到正确输入所需的输入。

所以,既然我们了解了我们在寻找什么,让我们来看看您的建议。

如果您使用 SHA-512 和 MD-5 对密码进行两次哈希处理,然后将每个密码截断为 128 位,然后将它们连接在一起,出于所有意图和目的,您将给攻击者两个哈希值以供使用。在许多情况下,只要生成的长度是合理的(很可能是 128 位),截断并不会严重降低散列的安全性。

这意味着您正在使用两个快速散列函数(SHA-512 和 MD-5 都太快而无法成为有效的密码散列算法),并为攻击者提供了选择他们想使用哪一个来破解您的散列的机会. 在这种情况下,他们肯定会选择 MD-5,并将输入输入其中,将散列截断为 128 位,并将其与散列的 MD-5 部分相匹配,一旦匹配,就近了100% 确定它们还具有在一次尝试中计算散列的 SHA-512 部分所需的值。

因此,这种特定的结构不仅不会提高安全性,而且实际上会大大削弱安全性。虽然有其他潜在的结构可以证明可以提高安全性,但要做到这一点并不是一件简单的事情,因此如果您真的想要合理的安全保证,请使用经过验证的结构,例如具有合理工作因子的 bcrypt。

从抗碰撞性(发现两个冲突消息)和第二原像抗性(发现与给定消息碰撞的不同消息)的角度来看,多个哈希的连接至少与最强的哈希一样安全(证明:对于这两个属性中的任何一个,任何破坏连接的攻击都可以变成破坏每个散列的攻击。例如,假设的 640 位 MD5||SHA-512 的冲突消息也会与 SHA-512 发生冲突,因此如果SHA-512 是抗碰撞的,那么 MD5||SHA-512 是抗碰撞的)。

从查找消息散列到给定值([first-]原像抗性)或查找已知散列到给定值(密码散列中的情况)的未知(可能是短或低熵)消息的角度来看,它谨慎地考虑多个哈希的串联是不安全的(可能比任何哈希都差得多)。我们可以构造散列,这样每个散列都可以单独抵抗从其散列中找到未知消息(在一些太大而无法探索的集合中随机选择),但串联完全不适合这种情况。

对于许多迭代哈希,包括所有 Merkle-Damgård 哈希(因此是 MD5、SHA-1、各种 SHA-2),使用多重冲突的概念,可以证明多个哈希的连接并不比最强的哈希。请参阅 Antoine Joux:迭代哈希函数中的多重冲突。在 Crypto 2004 中应用于级联结构。

上面的文章强烈建议使用 SHA-512 的 128 位加上 MD5 的 128 位(或)使用 SHA-512的 256 位,后者更安​​全。我们对前者的唯一保证是它不会比截断为 128 位的 SHA-512 差,后者可以在大约 2 64 个哈希中被攻击,而我们预计后者需要大约 2 128个哈希来攻击。

参考本文前几段: https ://crackstation.net/hashing-security.htm

如果您正在考虑编写自己的密码哈希代码,请不要!

我知道您不考虑编写自己的哈希代码,而是使用多个标准化的代码来无缝地提高安全性。然而,这不会给你带来任何好处或给你带来的好处很少。

Ratchet Freak ( https://softwareengineering.stackexchange.com/questions/115406/is-it-more-secure-to-hash-a-password-multiple-times ) 指出您的哈希函数只会和您的一样安全链中最弱的功能。众所周知,较弱的算法会更频繁地发生冲突,因此可能会增加发生冲突的风险——从而降低您的整体安全性。

此外,如上所述,这将减少熵而不是增加它。

您也没有理由宁愿继续实施两种不同的方法并将它们结合起来 - 实际上不会有任何收益或收益很少。256 位 SHA-512 将比两个合并的 128 位散列更强 - 因为熵增加并且整体更强。MD5 将包含较低的熵,因此会降低安全性。

编辑

为了澄清答案:

对于上述情况, SHA-512 比 MD5 强(对于提到的位数,256 和 128)。MD5 更有可能导致冲突。https://stackoverflow.com/questions/2117732/reasons-why-sha512-is-superior-to-md5

128 位 MD5 和 128 位 SHA512只能两者中较弱的 128 位 MD5 一样抗碰撞。https://stackoverflow.com/questions/7407835/512-bit-hash-vs-4-128bit-hash

编辑

正如 fgrieu 在评论中指出的那样,事实证明这不是真的。

作为说明,我们可以发现新的 MD5 冲突率很高,但是对于 SHA512 被截断为 128 位没有已知的冲突,因此对于 MD5 和 SHA512 被截断为 128 位的 256 位串联没有已知的冲突。-弗格里厄

我认为这是有益的唯一方法是防止彩虹表,它可能不会为你的哈希集中做好准备。应该使用盐而不是集中哈希。但是由于您对事物的密码安全方面不感兴趣(“我没有任何特别的意图,我希望将它视为简单的另一个哈希函数”

评论中提出的观点。

  • 为了减少冲突,串联更好(因为您需要同时在两个哈希上发生冲突)。为了减少原像攻击,链接更好(因为您需要按顺序反转两个哈希)。- 本·沃伊特