0

我的页面上有一个像这样的脚本保护的区域:http: //www.wikihow.com/Create-a-Secure-Login-Script-in-PHP-and-MySQL 我现在需要的是某种密码忘记密码时的重置功能。只有几个用户,我尽量让它变得简单。

所以我认为它将如何工作:

  1. 用户在那里输入电子邮件地址
  2. 用户收到一封电子邮件,其中包含一个包含 sha512 哈希密码的链接,并且它的用户名作为 GET 参数
  3. 该脚本检查用户名和密码哈希是否适合
  4. 用户现在可以在那里输入新密码

这样做是否有任何强大的安全漏洞,或者这是一种常见的方式?最好的做法是什么?我真的不想要任何额外的安全问题或类似的东西......

更新:密码经过哈希处理和加盐处理。

4

3 回答 3

10

这并不像它应该的那样安全。

您正在通过电子邮件(不安全)发送用户名和密码(诚然以一种难以逆向工程的形式)——这些用户名和密码可能会在其他网站上重复使用。

使用随机生成的字符串,而不是任何真实的凭据。将随机字符串存储在数据库中,并使用它来查找要重置密码的用户。只允许字符串在有限的时间内工作。

于 2013-06-03T08:41:43.137 回答
3

试探性流程应该是这样的:

  1. 用户点击“密码重置”链接。
  2. 电子邮件被发送到用户注册的地址。
  3. 电子邮件包含一个在 1 小时内到期的唯一链接。
  4. 用户单击链接并被带到带有密码字段的页面。
  5. 用户输入新密码,密码经过哈希处理并保存。

仅供参考,您永远不应该以任何方式传输密码或其哈希值。

  1. 密码永远不应该以原始形式或未加盐的哈希值保存。
  2. 永远不应该传输散列。
于 2013-06-03T08:50:38.077 回答
1

加密密码散列的唯一位置应该是您的服务器后端,而不是其他任何地方。

如果攻击者有要检查的哈希值,则攻击者可以使用几乎无限的处理能力来暴力破解哈希值,而在任何其他情况下,他们将不得不受到服务器容量的限制,并且您会立即意识到这一点。

如果您想确保它的安全,请生成随机密码重置密钥并将它们发送到用户的注册电子邮件(仅此而已 - 电子邮件安全是用户的问题)。如果用户使用该密钥(通常作为 GET 参数)返回站点,那么您可以让用户访问密码更改表单。

据我所知,这是当今最常见和最安全的密码重置方法之一(尽管有 2factor auth 等)。

于 2013-06-03T08:52:27.573 回答