安全的“丢失密码”功能如何运作?

时间:2012-06-02 09:58:55

标签: security passwords password-recovery password-retrieval

进行密码重置的“完成”方式似乎如下:

  1. 生成临时令牌(zs8Abn27
  2. 将令牌存储在数据库中以及到期时间
  3. 向用户发送电子邮件令牌
  4. 用户转到/password_reset?t=zs8Abn27
  5. 根据数据库检查令牌的有效性
  6. 如果有效用户获取存储在您数据库中的新密码(当然是加盐和加密的)
  7. 我的问题是,如果黑客获得对您的数据库的读/写访问权限,他们是否只能创建自己的令牌,并以这种方式获得访问权限?即使他们只是具有读访问权限,他们也可以使用他们可以看到的令牌来获得临时访问权。

    为了记录,这完全是概念性的,我只是好奇你如何才能使这样的功能安全。

4 个答案:

答案 0 :(得分:1)

阅读Everything you ever wanted to know about building a secure password reset feature

是的,有权访问数据库的人可以创建自己的令牌,但他们也可以将密码重置为他们喜欢的任何东西(假设他们知道使用的散列算法)。此外,他们可以随时创建新帐户,提升权限或执行任何其他恶意任务。

假设如果数据库遭到破坏,您就会遇到规模问题,这使得重置令牌的访问变得无关紧要!

答案 1 :(得分:0)

您对所需流程的描述是正确的。

如果黑客可以访问您的数据库,那么所有都会被清除。你应该努力确保这是不可能的。

答案 2 :(得分:0)

嗯,首先,不仅仅是因为这个问题,我们需要确保黑客违反数据库并获得读/写访问权。

另一种方法是将令牌存储在数据库中,而不是存储在文件系统中。在一个不可读但仅由网络服务器用户访问的文件夹中,.htaccess保护访问权限,并由cron定期清除,因此令牌过期相对较快。这样,负责密码恢复的代码将检查此文件,而不是数据库。

但又一次,这也是可以破解的。

答案 3 :(得分:0)

另外,我们已经说过,您可以在将令牌存储到您的数据库之前对其进行散列,但是在将其邮寄给用户之后。