你甚至不应该存储(无盐)你用户密码的哈希值:你应该首先生成一个随机字符串("salt"),将它与它们的密码连接起来,散列结果(使用SHA1或你喜欢的任何算法)并存储数据库中的哈希值和salt.如果攻击者可以访问数据库中的哈希值,则会破坏预先计算的字典("彩虹表")攻击.
完成后,您不应该在数据库中存储用于密码重置的临时令牌:如果攻击者获得对用户表的访问权限,他们只需要完成您的"我忘记了我的密码"表单并从中读取令牌数据库,然后重置该用户的密码,而不会看到生成的电子邮件.因此,令牌被称为"密码等效",应该以与密码本身完全相同的方式受到保护:盐渍和散列.
存储了重置令牌的盐渍哈希后,您现在可以使用用户的ID向用户发送链接,并在URL的查询字符串中重置令牌,例如http://www.example.com/resetpassword.php?user=235747&token=347659864124567532256.
在下面的链接,所提供的用户和令牌将提供给您的PHP脚本$_GET['user']和$_GET['token']; 然后,您可以从数据库中检索salt,与提供的令牌连接,计算预期的哈希值并与数据库记录中的哈希值进行比较.如果匹配,您可以确信用户已收到您发送的电子邮件,然后您可以提示他们输入所需的新密码.