1

假设我们有以下内容:
- 字符串:str
- 字符串的 MD4 散列:MD4(str)
- 字符串的 MD5 散列:MD5(str)

MD4 和 MD5 是加密“破”算法,这意味着不难:

1) 找到 str_2 where MD4(str) = MD4(str_2) (即攻击 MD4)
2) 找到 str_3 where MD5(str) = MD5(str_3) (即攻击 MD5)

但它有多难:

3)找到str_4 where MD4(str) = MD4(str_4) AND MD5(str) = MD5(str_4)
(即同时攻击MD4和MD5)?

显而易见(可能不是很有效)的方法是:

1)找到一个字符串 STR,其中 MD4(STR) = MD4(str)
2) 检查 MD5(STR) = MD5(str)
3)如果是这样,我们就完成了。如果不是,则返回第 1 步并使用不同的字符串满足第 1 步。

但是上面的算法对我来说似乎并不快(或者是吗?)。那么由 MD4 和 MD5 散列的字符串是否真的可以免受第二次原像攻击?

编辑:
(1)主要关注的是增强第二个原像阻力

(2)主要动机是不为今天的应用程序使用过时的哈希。相反,它有两个方面:首先,我预计今天被认为是安全的哈希值会被破坏。例如,如果我只使用 SHA-2,那么它坏掉的那一天就是我会非常担心我的数据的那一天。但是如果我使用 SHA-2 和 BCrypt,那么即使两者都单独损坏,可能仍然无法击败 concat(Sha2_hash, Bcrypt_Hash) 的第二个前映像阻力。其次,我想减少意外碰撞的机会(服务器认为两个输入是相同的,因为两个哈希恰好是相同的)

4

2 回答 2

1

这种事情并没有像你想象的那样提高安全性。得到的 (M+N) 位值实际上比本机生成 (M+N) 位输出的散列的输出要弱。如果您想了解更多详细信息, crypto.stackexchange.com上的这个答案会更深入一些。

但底线是,当构造一个输出是其他哈希函数的串联的哈希函数时,你得到的输出充其量与最强的组成哈希一样强。

我不得不问,为什么甚至使用 MD4 或 MD5 并开始遇到这个麻烦?使用 SHA-3。如果您想感到“额外安全”,请计算您感到舒适的安全边际,并将其增加一定百分比。也就是说,如果你觉得 384 位就足够了,那就选择 512。


因此,有了更多关于您正在尝试做的信息,即使用文件内容来生成“快速校验和”值并同时为文件生成唯一的定位器/标识符,我仍然认为选择一个哈希是更好的方法。

如果您坚持使用两个散列函数,那么我会提出,与其连接两个散列,更好的方法是使用使用两个不同散列函数/算法的 HMAC。请注意,我没有严格的证据证明这种方法效果更好,或者这种结构不会产生可怕的输出。所以带着一粒盐:

H1H2成为两个密码安全的哈希函数,让P成为您的输入数据。然后,您的文件的哈希和文件标识符由构造给出:

HMAC (K,P) = H1((KGEN(P) ⊕ PAD1) ∥ H1((KGEN(P) ⊕ PAD2) ∥ P)))

在哪里

KGEN (P) = H2(P)
于 2013-07-31T21:28:08.633 回答
0

难度有点大。因为需要同时计算 MD4 和 MD5 的碰撞。但是在密码学中有点蹩脚的术语。推出自己的安全计划是敌人#1。然而,也有一些例子,当人们链接算法时,例如 DES => 3 DES 或 TrueCrypt 允许链接多个加密算法或 PBKDF2 密钥派生运行相同的算法 N 次。

说真的,如果您需要强哈希 - 使用 SHA2 及更高版本。

发现 MD4 和 MD5 哈希冲突的问题在于,有可能制作一个设备链,允许攻击者线性扩展攻击尝试的数量,并且如果预算足够大,这听起来似乎是合理的。

于 2013-07-31T21:29:50.367 回答