【发布时间】:2015-06-16 09:27:26
【问题描述】:
我最近读到 MD5 并不安全,因为它可以在很短的时间内被追踪。
如果我只给出一个固定的 512 位数据作为输入。 MD5 将给出 128 位散列(32 个十六进制值)
如果 MD5 有缺陷,那么在给定 128 位哈希的情况下,任何人都可以提出重建 512 位输入的最佳方法吗?
(旁注:我非常想实现这一点。C++ 是速度的更好选择,还是 Java 的内置安全包更好?)
【问题讨论】:
-
我想你误解了为什么人们不建议它——这不是因为它很容易可逆(它是完全不可逆的,或者压缩效果会很棒),而是因为它的计算成本和所以rainbow table 可以很便宜地建立起来。
-
对于任何一个 128 位散列,不会有 2^(512-128) 个可能的 512 位输入吗?如果您唯一知道的是输入是 512 位随机数据,则无法单独反转任何给定的哈希。
-
512 位除以 128 位等于 4。因此,对于大小为 512 位的四个不同输入,可以预期每个 MD5 哈希值都会返回。即使您可以计算每个 512 位输入的 MD5 散列(其中有超过 1.3E154 个),您如何知道哪些匹配是原始消息,哪些是由散列冲突引起的红鲱鱼?跨度>
-
有 2^128 个可能的 128 位散列,并且有 2^512 个可能的 512 位数据块。对于任何一个 128 位散列,必须有超过四个可能的 512 位数据块。
-
找个数学家给你解释“pidgeohole原理”。有 2 ** 384(约 4x10 ** 115)个不同的 512 位块散列到相同的 MD5。原则上也不可能逆转。