假设我们有以下内容:
- 字符串:str
- 字符串的MD4哈希:MD4(str)
- 字符串的MD5哈希:MD5(str)
MD4和MD5是加密“破解”的算法,这意味着它不难:
1)找到str_2,其中MD4(str)= MD4(str_2)(即攻击MD4)
2)找到str_3,其中MD5(str)= MD5(str_3)(即攻击MD5)
但是它有多难:
3)找到str_4,其中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)仍然是不可行的。 第二,我想减少意外碰撞的几率(服务器认为两个输入是相同的,因为两个哈希值恰好相同)
答案 0 :(得分:1)
这种事情并没有像你想象的那样提高安全性。得到的(M + N)位值实际上弱于本机生成(M + N)位输出的散列的输出。如果您想了解更多详细信息,crypto.stackexchange.com上的答案会更深入。
但最重要的是,当构造一个哈希函数,其输出是其他哈希函数的串联时,你得到的输出最多就像最强的组成哈希一样强。
我不得不问为什么甚至使用MD4或MD5并开始这个麻烦?使用SHA-3。如果您想要“额外安全”,那么计算您感觉舒适的安全边际,并将其增加一定百分比。也就是说,如果你觉得384位就足够了,那就去512.
因此,有关您正在尝试做的更多信息,即使用文件内容生成“快速校验和”值并同时生成文件的唯一定位器/标识符,我仍然认为选择单个哈希是更好的方法。
如果你坚持使用两个哈希函数,那么我会提交而不是连接两个哈希值,更好的方法是使用两个不同的哈希函数/算法来使用HMAC。请注意,我没有严格证明这种方法更好,或者这种结构不会产生可怕的输出。所以带上一粒盐:
让H1
和H2
成为两个加密安全哈希函数,让P
成为您的输入数据。然后,哈希&文件的文件标识符由构造提供:
HMAC (K,P) = H1((KGEN(P) ⊕ PAD1) ∥ H1((KGEN(P) ⊕ PAD2) ∥ P)))
其中
KGEN (P) = H2(P)
答案 1 :(得分:0)
有点困难。因为需要计算MD4的碰撞并同时计算MD5的碰撞。但有点在密码学中是一个蹩脚的术语。滚动自己的安全计划是敌人#1。但是,有些例子,当人们连锁算法时,例如DES => 3 DES或TrueCrypt允许链接多个加密算法或PBKDF2密钥推导运行相同的算法N次。
说真的,如果你需要一个强哈希 - 使用SHA2及以后的版本。
发现MD4和MD5哈希冲突的问题在于,有可能制作一系列允许攻击者线性扩展攻击次数的设备,并且给予足够大的预算,这听起来似乎有道理。