PHP:当用户点击忘记使用md5加密的密码时,如何将原始密码发送给用户?

时间:2010-05-06 10:06:36

标签: php md5 flawed-concept

我正在使用md5来加密项目中的密码。

当用户点击忘记密码并提交他的电子邮件时,我必须将密码发送给他。

但密码是使用md5加密的。不应该生成新密码。因为在这个项目中管理员可以看到用户的所有细节。所以我必须向管理员显示原始密码。所以初始密码非常重要。那我该如何解密密码或以其他任何方式向他发送原始密码?

提前致谢...

5 个答案:

答案 0 :(得分:39)

哈希不是为解密而设计的,这就是为什么它们通常被称为“单向哈希”而不仅仅是哈希。

相反,要么......

  1. 生成一个新密码,哈希,存储新密码哈希代替旧密码,并将新生成的密码通过电子邮件发送给用户。

  2. 生成一个新密码,哈希,将其存储在临时密码字段中,然后当用户使用该密码登录时,提示他们输入一个永久的新密码。

  3. 生成nonce,将其存储在nonce的字段中,并通过电子邮件向用户发送一个包含该nonce的链接,这将使他们可以访问页面以输入新密码。

  4. 第三个选项可能是最好的,因为它不会在普通视图中为读取用户电子邮件的人留下实际密码(临时或非临时),并且因为它使用了nonce,一旦使用它不能被恶意用户再次使用。

    用于密码的哈希原因是专门用于防止它们以恶意用户只需查看数据库就可以确定密码的形式存储。

    编辑:

    “所以我必须向管理员显示原始密码。”

    如果您正在对密码进行哈希处理,则不可能。一般来说,允许管理员查看用户的密码实际上是一个糟糕的主意,因为很大一部分用户倾向于使用相同的密码来处理多件事情,以及一件事的管理员(例如,公司网络可能不是许多其他事情的管理员(比如用户的网上银行系统)。

    MD5不是加密算法,它是一种哈希算法。两者不一样;加密被设计为可逆的(因此补充术语“解密”),而散列被设计为单向的。

答案 1 :(得分:5)

你做不到。密码哈希[1]被称为“不可逆”的原因是它们不能被逆转。这就是使用它们进行密码存储的全部意义 - 这意味着,如果一个坏人手上的密码数据库,他不能只是反转哈希来找出所有密码是什么。

我从您的编辑中看到,您的意图是向管理员用户显示用户的密码,而不是用户自己进行密码恢复。这是非常糟糕的主意。许多用户尝试通过对多个系统使用相同的密码来减轻记住密码的负担,这意味着在 系统中显示他们的密码很可能会损害他们在其他帐户上的帐户 systems。

真实的故事:早在2000年,我就在一家创建语音邮件系统的初创公司工作。为了在第一天向我介绍产品,IT主管让我创建了一个语音邮件帐户,我做了,然后他在管理界面中提出了它。当我看到屏幕上显示我的语音信箱PIN以便所有人看到时,我差点就死了。部分是因为它的安全性很差,但主要是因为,即使他不知道,他现在知道我的ATM卡的密码。这只是坏事,坏事,坏事。不要那样做。


[1] MD5是一种散列算法,而不是加密算法。两者之间的关键区别在于,对于任何给定的散列算法,存在无限数量的输入将产生相同的输出(这就是为什么它不可逆),而加密具有输入的一对一对应关系。输出

答案 2 :(得分:1)

如果密码已经过哈希处理,那么您可能需要创建随机密码并将其发送给用户。然后,一旦他们登录,将他们带到更改密码屏幕,这样他们就可以将密码更改为更难忘的内容。

答案 3 :(得分:1)

哈希值的一个特殊目的(其中包括)是,如果它完美运行,它是不可逆的。

“忘记密码”功能最常见的方法是生成新密码并告诉用户尽快更改密码。

答案 4 :(得分:1)

只需将其添加为旁注:

虽然您无法“取消”MD5哈希值,但您可以在Rainbow表格中查找它。 可能 允许您将原始明文密码发送给用户。 我不打算这样做,因为与仅创建新密码并将其发送给用户相比,这只是浪费资源。

来自http://en.wikipedia.org/wiki/Rainbow_table

  

彩虹表是一种查找表,提供时间 - 内存权衡,用于从散列函数(通常是加密散列函数)生成的密码散列中恢复明文密码。一个常见的应用是使针对散列密码的攻击成为可能。盐通常采用散列密码来使这种攻击更加困难,通常是不可行的。

另请参阅以下评论以获取其他说明。