PHP忘记密码功能

我有一个小社区网站,我需要实现某种被遗忘的密码功能。我目前将密码存储在DB中,用MD5加密。

是否可能排序的’解密’,并通过电子邮件发送给他们,或者我需要一个密码重置页面?

MD5散列密码不可逆。 (MD5是散列,而不是真正加密,所以有一个微妙的区别)。是的,你肯定想提供一个密码“重置”过程(而不是简单地通过电子邮件的密码)。

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

>当用户要求重置密码时,请输入他们的电子邮件地址
>不要指明该电子邮件地址是否有效(只是告诉他们电子邮件已发送)。这是开放的辩论,因为它降低可用性(即我不知道哪个电子邮件我注册),但它提供较少的信息,试图收集的信息,哪些电子邮件实际注册在您的网站上的人。
>生成令牌(可能是使用salt的哈希时间戳),并将其存储到用户记录中的数据库中。
>向用户发送电子邮件以及指向您的http * s *重置页面(网址中的令牌和电子邮件地址)的链接。
>使用令牌和电子邮件地址验证用户。
>让他们选择一个新的密码,替换旧的密码。
>此外,最好在特定时间范围(通常为24小时)后过期这些令牌。
>可选地,记录已经发生了多少“忘记”尝试,并且如果人们请求大量电子邮件,则可以实现更复杂的功能。
>可选地,记录(在单独的表中)请求复位的个人的IP地址。从该IP增加计数。如果它达到超过,比如说10 …忽略他们未来的请求。

给你一些更多的细节哈希…

当你使用PHP中的md5()函数哈希一个值,比如密码时,无论你在哪个服务器上运行,密码的最终值都是相同的。 (所以有一个区别,我们可以看到在散列和加密…之间没有私人/公共密钥涉及)。

所以这里是你会看到人们提到的漏洞rainbow tables.一个非常基本的解释彩虹表是…你md5()哈希一串字典单词(弱密码),以获得他们的md5()哈希值。将它们放在数据库表(彩虹表)。

现在,如果你妥协一个网站的数据库,你可以运行用户的哈希密码对你的彩虹表,(本质上)“反向”的哈希回到密码。 (你不是真的“颠倒”的哈希…但你得到的想法)。

这就是“salting”你的密码是最好的做法。这意味着(再一次,非常基本的想法),你附加一个随机值到用户的密码,然后对其进行哈希。现在,当彩虹表对你的数据库运行时,它不是那么容易“逆转”,因为“password”的md5()哈希不同于“password384746”。

这里有一个很好的SO Q / A,应该有所帮助。 Secure hash and salt for PHP passwords

http://stackoverflow.com/questions/6585649/php-forgot-password-function

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:PHP忘记密码功能