PHP忘记密码功能

Lia*_*iam 36 php security md5 password-recovery

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

是否有可能将"解密"排序并通过电子邮件发送给用户,还是需要重置密码?

Jar*_*obb 134

MD5哈希密码不可逆.(MD5是散列,并没有真正加密,所以有一个微妙的区别).而且你一定要提供密码"复位"过程(而不是简单地通过电子邮件发送密码).

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

  1. 当用户要求重置密码时,请输入他们的电子邮件地址
  2. 不要指明该电子邮件地址是否有效(只需告诉他们已发送电子邮件).这是有争议的,因为它降低了可用性(即我不知道我注册了哪个电子邮件),但它向试图收集有关您网站上实际注册的电子邮件的信息的人提供的信息较少.
  3. 生成令牌(可能使用salt对时间戳进行哈希处理)并将其存储到用户记录中的数据库中.
  4. 向用户发送电子邮件以及指向http s重置页面的链接(网址中令牌和电子邮件地址).
  5. 使用令牌和电子邮件地址验证用户.
  6. 让他们选择一个新密码,替换旧密码.
  7. 此外,在一段时间后(通常为24小时)过期这些令牌是个好主意.
  8. 可选地,记录已经发生了多少"忘记"尝试,并且如果人们请求大量电子邮件,则可能实现更复杂的功能.
  9. (可选)记录(在单独的表中)请求重置的个人的IP地址.增加该IP的计数.如果它超过10比10 ......忽略他们未来的要求.

为了给你更多细节哈希...

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

因此,您可以看到人们提到彩虹表的漏洞.彩虹表的一个非常基本的解释是...你md5()散列一堆字典单词(弱密码),以获得他们的md5()哈希值.将它们放在数据库表(彩虹表)中.

现在,如果您破坏了网站的数据库,您可以针对您的彩虹表运行用户的散列密码(实质上)将散列"反向"回密码.(你并没有真正"扭转"哈希......但你得到了这个想法).

这就是"腌制"密码的最佳做法.这意味着(再次,这里是非常基本的想法),您散列之前将随机值附加到用户的密码.现在,当彩虹表针对您的数据库运行时,它不像"反转"那么容易"因为"密码"的md5()散列与"password384746"不同.

这是一个很好的SO Q/A,应该有所帮助.为PHP密码保护哈希和盐

  • @testing好问题......它与第9点非常相似,除非在这种情况下攻击者使用僵尸网络,代理或其他循环方法每次都从不同的IP地址命中你.例如,如果您的系统检测到在几分钟或几小时内发生了"忘记请求"的大量增加,您可能会考虑暂时放慢或禁用该功能.(当然,您的阈值将取决于您自己对用户群大小的主观判断以及被视为"正常"卷的内容). (2认同)

Man*_*han 9

根据这篇文章关于基于表单的网站身份验证的权威指南,对于步骤3和4.,我不确定您是否应该发送您正在存储的相同令牌.

我猜你必须发送令牌,然后散列它并将散列的令牌存储在DB中.否则,如果您的数据库遭到入侵,则可以访问重置密码页面.

总结一下:

$token = md5(microtime (TRUE)*100000);
$tokenToSendInMail = $token;
$tokenToStoreInDB = hash($token);
Run Code Online (Sandbox Code Playgroud)

hash是一种散列算法.


cee*_*yoz 7

不,MD5是不可逆转的.哈希密码的关键在于使得访问您的数据库的攻击者无法访问每个人的密码.

也就是说,MD5(特别是无盐MD5)通常可以使用彩虹表进行攻击.为了安全起见,您最好使用bcrypt.