【问题标题】:Find message from hash?从哈希中查找消息?
【发布时间】: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。原则上也不可能逆转。

标签: java c hash md5


【解决方案1】:

有 2 ** 384(大约 4x10**115)个不同的 512 位块,它们散列到相同的 MD5。原则上也无法逆转。

然而,可能找到那些 4x10**115 个块中的 一个,它产生与您想要的块相同的 MD5,并且 那是 为什么它被认为是不安全的。例如,如果您将文件连同 MD5 哈希一起发布到网络以验证其完整性,黑客可能会用具有相同哈希的不同文件替换它。

使用像 SHA256 这样更安全的哈希,即使这样也是不可能的。

【讨论】:

    【解决方案2】:

    MD5 是一种简单快速的算法,尤其是在使用 GPU 实现时,因此它可以被蛮力破解,这就是它不“安全”的原因。 但不安全的典型情况是关于字符数有限的密码及其典型组合(字典世界)

    对于 512bit 长的消息,即使使用 MD5,暴力破解也需要很长时间,相当于 64 个字符的密码,目前暴力破解限制在 10 个字符左右。

    【讨论】:

      猜你喜欢
      • 2020-04-27
      • 2018-07-17
      • 2012-07-02
      • 1970-01-01
      • 1970-01-01
      • 2016-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多