【发布时间】:2013-07-31 21:16:34
【问题描述】:
假设我们有以下内容:
- 字符串: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) 的第二个前映像阻力。 第二,我想减少意外碰撞的机会(服务器认为两个输入相同,因为两个哈希恰好相同)
【问题讨论】:
-
为什么不使用更好的哈希算法?
-
我使用 MD4 和 MD5 作为假设。主要动机如下:如果我只使用一个哈希(例如 SHA-2),那么 SHA-2 被破坏的那一天将是我开始非常关注我的数据安全的那一天。但是,如果我使用两个今天被认为是安全的哈希(SHA-2 和 bcrypt),那么即使一个被破坏(比如 SHA-2),我仍然有不错的保护,并且有更多时间来实现另一个系统(比如使用bcrypt 和一些未来的 SHA 版本)。
-
SHA-2 和 bcrypt 是一个非常奇怪的组合,因为 SHA-2 是通用哈希,而 bcrypt 是密码哈希。如果你想组合两个通用哈希,SHA-2 和 SHA-3 可能是最好的选择(一旦 SHA-3 真正标准化)
-
你能告诉我们更多关于你打算用这个做什么吗?作为旁注,这个主题可能更适合crypto.stackexchange.com。
-
@Aaron 您的逻辑缺陷是您假设较弱的哈希不会比较强的哈希更容易被破坏。您宁愿担心散列将来可能会被破坏,还是实际上有一个散列现在实际上已被破坏?如果您是明智的,您希望从每一位中获得尽可能多的安全性。与 MD5 或 MD4 相比,SHA-2 为您提供了更多的安全性。因此,每个可能是 SHA-2 位的 MD5 或 MD4 位都会使您的安全性变得更弱。
标签: hash cryptography