如何以纯文本格式输出MD5哈希密码?

时间:2010-06-27 03:11:30

标签: php md5

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

7 个答案:

答案 0 :(得分:20)

MD5不是加密 - 它是单向散列。你不能反转单向散列(理论上你可以找到一个明确同样的散列的明文,但通常一样好,但你不能在任何合理的时间内),所以你只需要设置一个新的密码并将其作为临时邮件发送给他们,和/或只是为他们提供重置密码的链接。

答案 1 :(得分:6)

使用单向散列的目的是阻止正是您要做的事情。如果您可以阅读明文密码,那么任何掌握数据库的人也可以。提示:你如何处理旧的备份媒体?扔进垃圾桶?众所周知,犯罪分子可以通过垃圾箱潜水进行备份。

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

答案 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幻灯片。

答案 3 :(得分:1)

没有

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

另外

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

答案 4 :(得分:1)

  1. 您不应该使用MD5。使用sha1并使用盐,互联网上有很多信息。

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

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

答案 5 :(得分:1)

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

可以计算一个密码,当通过此函数提供相同的散列时,例如f(password) == hash == f(password")

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

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

答案 6 :(得分:-1)

md5是单向加密 /散列函数。经过哈希处理后,只能将字符串与其散列版本进行比较,而不是解密。