2012-08-10 97 views
1

我有网站上的用户,他们的密码被加密(md5)并存储在数据库中。现在,我有他们的电子邮件,如果有人忘记了他的密码,我想给他发送链接以重置它的密码。这是创建链接重置密码的最佳做法?

任何人都可以建议如何做到这一点?哪些是最佳做法?

问候,卓然

+1

MD5不是 “加密”,这是* *散列。 MD5也不是很好的哈希。 – deceze 2012-08-10 09:54:00

回答

1

在是相当独特的,并且是随机生成的令牌字符串(相当长的)数据库流行的一列。当用户请求重置密码时,请在电子邮件中发送该令牌以进行验证。通过链接返回该令牌(aka GET)将确认用户有权访问该电子邮件地址,并允许他们重置密码。

2

你应该发送一封电子邮件,使用mail()并添加到db一个散列随机字符串。电子邮件应该包含一个链接,如“domain.com/forgot.php?h=HASHEDSTRING”。在该页面中,您应该检查哪个用户拥有该散列字符串并输出一个字段供他们重置密码。

0

你可以做如下,

  1. 如果用户忘记了自己的密码,允许他进入与注册邮箱。

  2. 发送一封电子邮件,重置密码链接和链接应包含MD5(部分数据) 例如:www.ex.com/md5_data

  3. 发送邮件进入检查电子邮件出现之前,如果存在取用户ID,存储用户ID,md5(数据),你正在邮件发送

  4. 当用户点击链接发送到邮件获取网址数据,并检查是否存在您的表中的MD5数据,如果存在获取用户ID并允许他使用用户ID设置新密码和更新密码,并从表中删除md5数据,所以如果他再次点击链接,它不应该工作。

1

办理密码重置可能看起来像这样的安全方式:

密码重设要求:

  1. 用户打开密码重置申请表,并进入电子邮件地址。
  2. 您的应用程序将检查电子邮件是否存在于您的数据库中。如果它存在,它会创建一个令牌,该令牌应该是随机的,并且不会从诸如userid或timestamp之类的信息中获取。 令牌的散列将存储在数据库中的一个单独的表中,以及用户标识和到期日期。与原始令牌的链接将通过电子邮件发送给用户。
  3. 应用程序显示电子邮件已发送的确认。此页面可以包含电子邮件地址,因此用户可以检查他是否有打字错误(毕竟没有关于电子邮件是否在数据库中的信息,因此攻击者无法测试它的存在)。

密码重置:

  1. 用户点击该链接并打开复位形式。在这个表格上,他可以输入两次新密码。令牌必须作为隐藏的输入标签包含在表单中。
  2. 提交表单后,应用程序散列数据库中的这样一个令牌的散列令牌和搜索。如果匹配且未过期,则可以允许用户更改密码。最后,令牌应该标记为已使用,我自己喜欢保持条目,所以我可以告诉令牌已经使用的用户,当他再次单击该链接。

您可以使用像SHA512这样的散列算法对没有盐的散列进行散列。这是安全的,如果令牌是非常强(最小长度20 0-9 A-Z A-Z)。理论上你必须检查你输入数据库之前,在实践中,这是可以忽略不计,例如哈希是否已经存在。

+0

UPPS,我刚才已经意识到这是一个古老的线程。 – martinstoeckli 2015-07-07 20:18:45

+0

欣赏此答案中的细节和清晰度。谢谢。 – Mina 2015-12-31 13:30:41

相关问题