【问题标题】:Is it possible to reverse MD5? [duplicate]是否可以反转MD5? [复制]
【发布时间】:2015-01-19 12:53:39
【问题描述】:

我对一个字符串进行了 MD5 哈希处理。

def hash(s: String) = {
    val m = java.security.MessageDigest.getInstance("MD5")
    val b = s.getBytes("UTF-8")
    m.update(b, 0, b.length)
    new java.math.BigInteger(1, m.digest()).toString(16)
}

现在我想要原始字符串。我该怎么做?

【问题讨论】:

  • 你不能。这是一个单向函数,不打算可逆。
  • 嗯,MD5 现在或多或少被认为是损坏的。在接下来的几年中,我们很可能会看到在破解 MD5 方面取得重大进展,所以,如果你可以等待 10 年,那么结合密码分析和计算能力的进步应该可以在实际的时间框架内做到这一点,即使不使用彩虹桌。
  • 你在“加密”时没有提供任何密码,所以即使是加密也不是一种有用的加密形式,因为任何人都可以运行解密功能。​​
  • @Jörg:不,哈希不包含有关原始字符串的足够信息。这不是复杂性的问题。

标签: scala hash md5


【解决方案1】:

MD5 是cryptographic hash function。加密哈希是一种方式函数。您无法反转加密哈希值,但您可以强制消息找到一个。

暴力破解意味着尝试所有可能的输入字符串,然后检查哈希值是否正确。这是可能的,因为加密哈希在计算上也是唯一的。这意味着有无穷无尽的消息会导致生成相同的哈希值,但不可能有两条消息产生相同的哈希值。由于 MD5 被破坏,MD5 散列对于特殊构造的消息来说不是唯一的。如果您能找到两条具有相同哈希值的消息,则称为冲突。

还可以创建称为彩虹表的巨大查找表。这有助于加快寻找正确输入的速度。这仅适用于相对较小或可猜测的数据输入;即它们主要用于查找弱密码。其中一些数据库可以在网上找到。

【讨论】:

  • 该问题要求原始字符串,但不是任意哈希冲突。
  • @ChrisMartin 为加密安全哈希生成任意哈希冲突是不可行的,因此归结为同一件事。基本上,如果你蛮力发现了一个 aswer,你可以确定它是正确的。
  • 是的,但“加密安全”不是描述 md5 的短语
  • “由于 MD5 已损坏,特殊构造的消息并非如此。”阅读也是一门艺术。
【解决方案2】:

您无法解密 MD5,这是 MD5 的功能,如果您想加密/解密数据,请使用其他加密技术,如 AES

【讨论】:

    【解决方案3】:

    你不能。 MD5 是单向哈希函数,这是不可能的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-15
      • 2023-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多