忘记PHP MySQL的密码URL令牌

时间:2012-07-31 15:53:42

标签: php mysql passwords token sha1

我是PHP新手,到目前为止创建了一个登录,注册和忘记密码,目前用户从MySQL表中发送了他们的密码。我现在使用sha1加密了密码。我目前正在编写代码:

当用户点击忘记密码链接时,他们输入用户名和电子邮件地址(已验证)。

我目前发现很难在发送的电子邮件中向他们发送网址链接,以指示他们重置页面。

我们非常感谢任何帮助(代码片段,教程,方法链接等)。

TA

1 个答案:

答案 0 :(得分:5)

  1. 您甚至不应存储(未加盐)用户密码的哈希值:您应首先生成随机字符串(“salt”),将其与密码连接,对结果进行哈希处理(使用SHA1或其中任何一个)您喜欢的算法)并将哈希值和盐存储在数据库中。如果攻击者可以访问数据库中的哈希值,则会破坏预先计算的字典(“彩虹表”)攻击。

  2. 完成此操作后,您不应该在数据库中存储用于密码重置的临时令牌:如果攻击者获得对用户表的访问权限,他们只需要完成“我忘记了密码”表单并从数据库中读取令牌,然后重置该用户的密码,而不会看到生成的电子邮件。因此,令牌被称为“密码等效”,应该以与密码本身完全相同的方式受到保护:腌制和散列。

  3. 在存储了重置令牌的盐渍哈希之后,您现在可以使用用户的ID向用户发送链接,并在URL的查询字符串中重置令牌,例如http://www.example.com/resetpassword.php?user=235747&token=347659864124567532256

  4. 在关注该链接后,您提供的用户和令牌将以$_GET['user']$_GET['token']的形式提供给您的PHP脚本;然后,您可以从数据库中检索salt,与提供的令牌连接,计算预期的哈希值并与数据库记录中的哈希值进行比较。如果匹配,您就可以确信用户已收到您发送的电子邮件,然后您可以提示他们输入所需的新密码。