假设我们有以下内容:
- 字符串: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) 的第二个前映像阻力。其次,我想减少意外碰撞的机会(服务器认为两个输入是相同的,因为两个哈希恰好是相同的)