PHP忘记密码函数

PHP忘记密码函数,php,security,md5,password-recovery,Php,Security,Md5,Password Recovery,我有一个小的社区网站,我需要实现一些忘记密码的功能。我目前将密码存储在数据库中,并使用加密 是否可以对“解密”进行排序并通过电子邮件发送给用户,或者我需要一个密码重置页面?MD5是一个单向散列。您需要让他们重置密码。不,您无法解密密码。这就是全部的想法 您需要向他们发送一个临时密码,让他们重置它。MD5哈希密码是不可逆的。(MD5是散列,而不是真正的加密,所以有细微的区别)。而且是您肯定希望提供一个密码“重置”过程(而不仅仅是通过电子邮件发送密码) 为您提供安全密码重置的高级工作流程… 当用户要

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


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

MD5是一个单向散列。您需要让他们重置密码。

不,您无法解密密码。这就是全部的想法


您需要向他们发送一个临时密码,让他们重置它。

MD5哈希密码是不可逆的。(MD5是散列,而不是真正的加密,所以有细微的区别)。而且您肯定希望提供一个密码“重置”过程(而不仅仅是通过电子邮件发送密码)

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

  • 当用户要求重置密码时,请让他们输入电子邮件地址
  • 不要指明该电子邮件地址是否有效(只需告诉他们已发送电子邮件)。这是一个值得商榷的问题,因为它降低了可用性(即,我不知道我注册的是哪封电子邮件),但它为试图收集您网站上实际注册的电子邮件信息的人提供的信息较少
  • 生成一个令牌(可能用salt散列时间戳)并将其存储到用户记录中的数据库中
  • 向用户发送一封电子邮件以及指向https重置页面(url中的令牌和电子邮件地址)的链接
  • 使用令牌和电子邮件地址验证用户
  • 让他们选择新密码,替换旧密码
  • 此外,最好在特定时间段(通常为24小时)后使这些代币过期
  • 或者,记录发生了多少次“忘记”的尝试,如果人们请求大量电子邮件,也许可以实现更复杂的功能
  • 或者,记录(在单独的表格中)请求重置的个人的IP地址。从该IP递增一个计数。如果它曾经超过,比如说,10。。。忽视他们未来的要求
  • 为您提供有关散列的更多细节…

    当您在PHP中使用md5()函数散列一个类似密码的值时,不管您在哪台服务器上运行该密码,该密码的最终值都将是相同的。(因此,我们可以立即看到散列和加密之间的一个区别……不涉及私钥/公钥)

    因此,在这里,您将看到人们提到易受攻击的漏洞。彩虹表最基本的解释是。。。您可以对一组字典单词(弱密码)进行md5()散列,以获取它们的md5()散列值。将它们放在数据库表(rainbow表)中

    现在,如果你破坏了一个网站的数据库,你可以在rainbow表上运行用户的散列密码,从而(本质上)将散列还原为密码。(你不是真的在“反转”散列……但你明白了)

    这就是“腌制”密码的最佳做法。这意味着(这里也是最基本的想法)在散列用户密码之前,向用户密码添加一个随机值。现在,当rainbow表在数据库上运行时,它不会那么容易“反转”,因为“password”的md5()散列与“password384746”不同


    这里有一个很好的问答,应该会有帮助

    您需要执行密码重置页面。在PHP中无法解密MD5。

    不,MD5是不可逆的。对密码进行哈希处理的目的是使访问数据库的攻击者无法访问每个人的密码


    这就是说,MD5(特别是未加盐的MD5)通常可以使用一个。为了安全,你最好使用.< /P> < P>你不能解密密码,你甚至不应该考虑通过明文发送密码给用户。(这是使我永远不再使用网站的第一种方法;这是一个巨大的安全漏洞。)提供一个密码重置页面,该页面由包含发送到用户密码恢复电子邮件的时间相关密钥的链接触发;这是密码恢复的最新技术。

    MD5
    是一种单向功能。你不能解密它。所以你需要有一个密码重置页面

    编写一个页面,接受md5和电子邮件地址作为get参数,并在db中查找电子邮件和md5的密码。按照Jared Cobb的说明,这应该会让你走上正确的道路。我还添加了一些示例

    例如要发送的url


    这应该足以让您知道该用户是有效用户并更改其密码

    最好的方法是要求用户在注册时提交其电子邮件地址。然后,如果他们忘记了,有一个忘记密码链接,该链接用电子邮件发送给他们的随机值重置他们的密码,这样他们就可以获得访问权限,然后将密码更改回更值得记忆的内容。这样,您就不需要破坏安全性。 你可以有一个链接,他们只需要在其中提交用户名,但为了更好的安全性,你应该有一个问答或值得记忆的单词。

    根据这篇文章,第3步。4.我不确定您是否应该发送与存储的令牌相同的令牌

    我猜您必须发送令牌,然后对其进行哈希并将哈希后的令牌存储在DB中。否则,如果您的数据库被破坏,您可以访问重置密码页面

    总结如下:

    $token = md5(microtime (TRUE)*100000);
    $tokenToSendInMail = $token;
    $tokenToStoreInDB = hash($token);
    

    其中散列是一种散列算法。

    使用php内置的密码验证和密码散列。

    如Marcus Reed所述,在2015/2016年,如果您的php版本>=5.5,请不要使用MD5,密码散列()和密码验证()为您的密码提供一种简单而安全的散列,能够提供成本并自动添加散列

    我目前没有投票或发表评论的能力,这就是为什么我要向一个
    $token = md5(microtime (TRUE)*100000);
    $tokenToSendInMail = $token;
    $tokenToStoreInDB = hash($token);