gpt4 book ai didi

PHP 忘记密码功能

转载 作者:IT王子 更新时间:2023-10-29 00:59:33 26 4
gpt4 key购买 nike

我有一个小型社区网站,我需要实现某种忘记密码的功能。我目前将密码存储在数据库中,使用 MD5 加密.

是否可以“解密”并通过电子邮件将其发送给用户,或者我需要一个密码重置页面吗?

最佳答案

MD5 散列密码不可逆。 (MD5 是散列,而不是真正的加密,因此存在细微差别)。 是的您肯定希望提供密码“重置”过程(而不是简单地通过电子邮件发送密码)。

为您提供安全密码重置的高级工作流程...

  1. 当用户要求重设密码时,让他们输入电子邮件地址
  2. 不要指明该电子邮件地址是否有效(只告诉他们已发送电子邮件)。这是有争议的,因为它降低了可用性(即我不知道我注册了哪个电子邮件),但它向试图收集有关哪些电子邮件实际注册在您网站上的信息的人提供了较少的信息。
  3. 生成一个 token (可能用盐对时间戳进行哈希处理)并将其存储到用户记录中的数据库中。
  4. 向用户发送一封电子邮件以及指向您的 https 重置页面的链接(URL 中的 token 和电子邮件地址)。
  5. 使用 token 和电子邮件地址来验证用户。
  6. 让他们选择一个新密码,替换旧密码。
  7. 此外,最好在特定时间范围(通常是 24 小时)后使这些 token 过期。
  8. (可选)记录发生了多少次“忘记”尝试,如果人们请求大量电子邮件,可能会实现更复杂的功能。
  9. 可选择记录(在单独的表格中)请求重置的个人的 IP 地址。从该 IP 增加计数。如果它超过了,比如说,10...忽略他们 future 的请求。

为您提供有关散列的更多详细信息...

当您使用 PHP 中的 md5() 函数对密码等值进行哈希处理时,无论您在哪个服务器上运行它,该密码的最终值都将相同。 (因此我们可以立即看出散列和加密之间的一个区别......不涉及私钥/公钥)。

因此,您会在这里看到人们提到 rainbow tables 的漏洞.彩虹表的一个非常基本的解释是......你 md5() 散列一堆字典单词(弱密码)以获得它们的 md5() 散列值。将它们放在数据库表(彩虹表)中。

现在,如果您破坏了网站的数据库,您可以针对您的彩虹表运行用户的散列密码,以(实质上)将散列“反转”回密码。 (你并没有真正“反转”散列......但你明白了)。

这就是“加盐”密码的最佳做法。这意味着(同样,这里是非常基本的想法)您将随机值附加到用户的密码之前,然后对其进行哈希处理。现在,当针对您的数据库运行彩虹表时,它并不那么容易“逆转”,因为“password”的 md5() 散列不同于“password384746”。

这是一个不错的 SO Q/A,应该会有帮助。 Secure hash and salt for PHP passwords

关于PHP 忘记密码功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6585649/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com