Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
忘记了PHP MySQL的密码URL令牌_Php_Mysql_Passwords_Token_Sha1 - Fatal编程技术网

忘记了PHP MySQL的密码URL令牌

忘记了PHP MySQL的密码URL令牌,php,mysql,passwords,token,sha1,Php,Mysql,Passwords,Token,Sha1,我是PHP新手,到目前为止,我创建了一个登录、注册和忘记密码,用户当前从MySQL表发送密码。我现在已经使用sha1加密了密码。我目前正在编写代码,以便: 当用户单击忘记密码链接时,他们输入用户名和电子邮件地址(已验证) 目前,我发现很难在发送的电子邮件中向他们发送url链接,将他们引导到要重置的页面 任何帮助(代码片段、教程、方法链接等)都将不胜感激 助教 您甚至不应该存储用户密码的散列(未加盐):您应该首先生成一个随机字符串(“salt”),将其与密码连接起来,对结果进行散列(使用SHA1或

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

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

目前,我发现很难在发送的电子邮件中向他们发送url链接,将他们引导到要重置的页面

任何帮助(代码片段、教程、方法链接等)都将不胜感激

助教

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

  • 这样做之后,您也不应该将密码重置的临时令牌存储在数据库中:如果攻击者获得对您的用户表的访问权,他们只需要填写您的“我忘记了我的密码”表单并从数据库中读取令牌,以便在没有看到生成的电子邮件的情况下重置该用户的密码。因此,令牌被称为“密码等价物”,并且应该以与密码本身完全相同的方式进行保护:salt和hash

  • 存储了重置令牌的salted散列后,您现在可以在URL的查询字符串中向您的用户发送带有用户ID和重置令牌的链接,例如
    http://www.example.com/resetpassword.php?user=235747&token=347659864124567532256

  • 遵循该链接后,提供的用户和令牌将作为
    $\u GET['user']
    $\u GET['token']
    对您的PHP脚本可用;然后,您可以从数据库中检索salt,与提供的令牌连接,计算期望的散列并与数据库记录中的散列进行比较。如果它们匹配,则您确信用户已收到您发送的电子邮件,然后您可以提示他们输入所需的新密码

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

  • 这样做之后,您也不应该将密码重置的临时令牌存储在数据库中:如果攻击者获得对您的用户表的访问权,他们只需要填写您的“我忘记了我的密码”表单并从数据库中读取令牌,以便在没有看到生成的电子邮件的情况下重置该用户的密码。因此,令牌被称为“密码等价物”,并且应该以与密码本身完全相同的方式进行保护:salt和hash

  • 存储了重置令牌的salted散列后,您现在可以在URL的查询字符串中向您的用户发送带有用户ID和重置令牌的链接,例如
    http://www.example.com/resetpassword.php?user=235747&token=347659864124567532256

  • 遵循该链接后,提供的用户和令牌将作为
    $\u GET['user']
    $\u GET['token']
    对您的PHP脚本可用;然后,您可以从数据库中检索salt,与提供的令牌连接,计算期望的散列并与数据库记录中的散列进行比较。如果它们匹配,则您确信用户已收到您发送的电子邮件,然后您可以提示他们输入所需的新密码


  • 你能把你用的代码贴出来吗?对于这样一个开放式的问题,很难帮助你。如果你说你已经“用sha1加密了密码”,我相信你的意思是你已经对密码进行了哈希运算。为了有效地提供帮助,如果您可以发布当前无法正常工作的代码,那就太好了。正如PHP手册中关于
    mysql\u*
    函数的章节所述:不建议在编写新代码时使用此扩展。相反,应该使用或扩展名。在选择MySQL API时,请参阅以获取更多帮助。您可以发布用于此目的的代码吗?对于这样一个开放式的问题,很难帮助你。如果你说你已经“用sha1加密了密码”,我相信你的意思是你已经对密码进行了哈希运算。为了有效地提供帮助,如果您可以发布当前无法正常工作的代码,那就太好了。正如PHP手册中关于
    mysql\u*
    函数的章节所述:不建议在编写新代码时使用此扩展。相反,应该使用或扩展名。在选择MySQL API时,请参阅以获取更多帮助。感谢这些信息,我假设可以通过为eg$salt=sha1(md5($password));;定义变量来实现这一点;。在研究时,我听说了彩虹表,但没有听说“salt”的方法,所以谢谢。@baile1990:不,salt应该是随机的:有关如何确保密码安全的详细课程,请参阅+1。尽管我需要问一下……假设攻击者获得了对用户表的访问权……他不也会通过这种方式获得对salt的访问权吗?当然,假设他“知道”页面使用的算法,那么他就不能通过这种方式访问用户表了吗?@ATaylor:通过对用户表的读取访问,攻击者确实会发现salt——但这只能让她对每个密码执行离线暴力攻击(在存在足够安全的哈希算法的情况下,即使攻击者具有显著的