【问题标题】:How to output MD5 hashed password in plain text?如何以纯文本形式输出 MD5 哈希密码?
【发布时间】:2010-06-27 03:11:30
【问题描述】:

我有一个使用 MD5 加密并存储在数据库中的站点上的成员密码。我想实现一个丢失密码的功能,如果用户忘记了他们的凭据,他们将通过电子邮件发送他们的凭据。但是如何输出未加密的密码,或者它是一种加密方式,因此不可能?

【问题讨论】:

  • @Slaks:不,他应该使用 MD5。他不应该允许他们恢复纯文本密码。
  • @Josh K - @SLaks 的意思是 MD5 是一个弱算法,而不是散列本身不好。
  • @Josh:不,他应该使用 bcrypt。
  • (@Slack,如果我错了,请纠正我,但是)我认为 SLak 的观点是,如果这是 OP 想要达到的结果,MD5 是一个糟糕的选择,因为它是一个哈希算法,而不是加密算法。
  • 有趣的是,人们害怕将明文密码存储在数据库中,这是相当安全的地方,但是通过网络以明文形式发送密码(这本质上是不安全的)对他们来说是完全可以的。请注意,许多网站仍然不使用 SSL。

标签: php md5


【解决方案1】:

MD5 不是加密——它是一种单向哈希。您无法反转单向散列(理论上您可以找到具有等效散列的明文,该散列通常一样好,但您不能在任何合理的时间内),因此您只需要设置一个新密码并将其作为临时电子邮件发送给他们,和/或只是向他们提供重置密码的链接。

【讨论】:

  • 实际上您所描述的并不是反转哈希。您能做的最好的事情就是找到一个散列到相同值的明文。断言您发现的内容与原始内容相同(而不仅仅是哈希冲突)假设比您实际知道的要多。
  • 当然,但这实际上并不重要——只要你找到哈希值相同的明文,你就可以打败它。
  • 好吧,如果尝试反转哈希的目的是检索原始文本而不是另一个有效的文本,那么它确实很重要。
  • +1。 “MD5 不是加密——它是一种单向哈希。”这就解释了一切。
  • 正如 Slartibartfast 所说,你不能,即使在理论上也是如此。
【解决方案2】:

使用单向散列的目的是防止你正在尝试做的事情。如果您可以读取明文密码,那么任何拥有您数据库的人也可以。提示:您如何处理旧的备份媒体?把它们扔进垃圾桶?众所周知,犯罪分子会在垃圾箱中寻找备份。

不要将用户的密码发回给他们,而是设置一个系统,以便他们可以重置密码。在实施之前阅读一些关于此的文章。

【讨论】:

    【解决方案3】:

    [由于 CodesInChaos 的提示,整个答案被替换;以前的答案是历史。]

    您不应该使用 MD5 来存储您的密码。如果您需要更多令人信服的理由来摆脱 MD5,请参阅LinkedIn password breach

    为了防止密码数据库泄露成为 LinkedIn 的头条新闻,您需要使用明显更好的散列函数。基于 DES 的 crypt(3) 在 70 年代后期可能已经足够好,但 modern bruteforce searching tools 每秒可以轻松测试数百万个候选密码。

    相比之下,同样的工具每秒只能暴力破解数千个 bcrypt 哈希值。 (遗憾的是,他们没有发布 scrypt 计时。)您的 MD5 比这些现成的替代品差 数百万倍。

    为了更深入地了解密码安全,我建议阅读Password security: past, present, future 幻灯片。

    【讨论】:

    • 我以前从未听说过 MD5 的弱点......而且我认为 SHA-512 只是让攻击变得更难,只是让攻击永远持续下去,而不是实际上更安全。嗯..我今天学到了一些东西。 +1
    • 这些冲突攻击与密码散列无关。相关的攻击是猜测正确的密码,您可以通过使用盐(防止多目标攻击)和慢散列来限制密码。普通 SHA-2 几乎和普通 MD5 一样糟糕。
    【解决方案4】:

    没有

    您无法从 MD5 哈希中恢复原始密码。这是一个单向哈希函数。

    还有

    您不应该向他们提供纯文本密码。相反,您应该做的是让他们更改密码,或者生成一个随机密码供他们使用,然后强制他们更改。

    【讨论】:

    • 使用彩虹表,在一定程度上可以恢复原始密码。
    • @Jon:当你在技术上“恢复”散列的纯文本时,他问的是散列是否是一种可逆加密,但它不是。
    【解决方案5】:
    1. 您不应该使用 MD5。用sha1也用盐,网上有很多资料。

    2. 哈希密码的目的正是如此。使用它是因为(理论上)无法获取原始密码,因此密码将被安全保存,并且可以用于轻松检查密码是否正确。

    3. 几乎所有网站都选择生成新密码并通过电子邮件发送作为忘记密码机制。

    【讨论】:

    • 甚至 SHA-1 在新部署中也迅速被弃用,转而支持 SHA-2 系列。
    【解决方案6】:

    虽然有人指出 md5 是一个散列函数,但它是一个接受密码并返回字符串的函数,例如。 f(password) == hash

    可以计算出一个密码,当通过这个函数给出相同的哈希值时,例如f(password) == hash == f(password")

    这通常通过预先计算所有可能的密码并将它们的哈希值存储在彩虹表 (See Wikipedia entry) 中来完成。可以下载这样的彩虹表,但它们是巨大的!

    由于散列函数的冲突,您可能无法恢复用户最初使用的相同密码。

    【讨论】:

      【解决方案7】:

      md5 是一种单向加密/散列函数。散列后,字符串只能与其散列版本进行比较,而不能解密。

      【讨论】:

        猜你喜欢
        • 2012-03-01
        • 2016-07-26
        • 1970-01-01
        • 2011-02-11
        • 2015-08-23
        • 2023-03-14
        • 2015-08-23
        • 1970-01-01
        相关资源
        最近更新 更多