54

可能重复:
忘记密码:实现忘记密码功能的最佳方法是什么?

我正在编写一个社区网站。

我想建立一个“忘记密码”功能。

环顾不同的网站,我发现他们采用了以下三种选择之一:

  1. 向用户发送一封电子邮件,其中包含指向唯一隐藏 URL 的链接,该 URL允许他更改密码(Gmail 和 Amazon)

  2. 向用户发送一封带有随机生成的新密码的电子邮件(Wordpress)

  3. 向用户发送他当前的密码(www.teach12.com)

选项#3对用户来说似乎是最方便的,但由于我将密码保存为 MD5 哈希,我看不到选项#3 对我来说如何可用,因为MD5 是不可逆的。这似乎也是不安全的选项,因为这意味着网站必须在某处以明文形式保存密码,并且至少明文密码是通过不安全的电子邮件发送给用户的。或者我在这里错过了什么?

因此,如果我不能执行选项#1,选项#2似乎是最简单的编程,因为我只需要更改用户的密码并将其发送给他。尽管这有点不安全,因为您必须通过不安全的电子邮件传达实时密码。然而,这也可能被麻烦制造者滥用,通过输入随机电子邮件和不断更改各种用户的密码来纠缠用户。

选项#1似乎是最安全的,但需要一些额外的编程来处理过期的隐藏 URL 等,但它似乎是大型网站使用的。

您使用/编程这些不同的选项有什么经验?有什么我错过的选择吗?

4

17 回答 17

33

4) 将两个随机金额记入他们的银行帐户,并要求他们输入。
5) Snail 给他们邮寄一些新密码并要求他们输入。
6) 让他们发短信或拨打某个号码,然后在电话中输入一些值号码与他们登记在案的手机号码。
7) 完全摆脱密码管理问题,将其外包给 OpenID 提供商,如 Stack Overflow、Facebook、博客引擎和其他开始做的事情。

除此之外,使用选项 #1 或 #2 以及两个都会在一小时内到期的附加功能。

于 2009-05-23T14:45:21.667 回答
9

我对将 #1 和 #2 描述为等效的答案的赞成票感到震惊。他们根本不是。向用户发送一个短期链接来更改他们的密码是最方便、最常用和最安全的方法,它不涉及带外交互(邮件、短信等)。几个原因:

  1. 通过忘记密码链接设置临时密码,用户可以有效地更改用户密码,并在知道用户登录信息的情况下将用户锁定在其帐户之外。有了链接,用户就知道有人在捣乱,他们的访问不会受到影响。
  2. 密码重置链接仅在短时间内有效,因此攻击者攻击的窗口非常小。即使他们这样做了,用户也会知道,因为如果攻击者截获该链接并使用它来更改密码,重置链接将不再有效。如果用户没有立即更改新分配的密码,则截获密码的攻击者可以无限期地悄悄冒充用户。所以最大的区别是,虽然黑客可以拦截重置密码链接电子邮件,但如果他们使用该链接更改用户的密码,用户就会知道有问题,因为该链接不起作用,他们会再次生成密码重置要求。
  3. 更易于使用 - 用户只需单击电子邮件中的链接,而不是输入您生成的新随机密码。

安全问题通常会使网站的安全性降低,而不是提高——它们是另一种攻击媒介,通常是最薄弱的环节。我强烈推荐阅读The Web Application Hacker's Handbook以获得关于这个主题的精彩讨论。

于 2010-08-04T17:00:50.030 回答
8

请注意,选项 #2 还要求您跟踪旧密码,如果在 24 小时内未使用新的随机密码,则它会使其失效。

否则,我可能会通过反复给你一个新的随机密码来惹恼你——如果你不在你的电子邮件附近,你可能不知道为什么你不能用你的正常密码登录。

另外,请避免要求“识别问题”。这些问题的答案通常比真正的密码更容易猜测/查找——因此每个人都可以将自己识别为我。请参阅Sarah Palin的故事,了解最近的一个例子,说明这是多么不安全。

于 2009-05-23T14:48:19.540 回答
6

选项 1 和 2 彼此一样不安全。

那里。我说了。如果用户的电子邮件帐户遭到入侵,那么就没有合理的安全方式来做事,除非您收集更多的私人数据,例如他们的地址、母亲的娘家姓——所有这些都可以猜到。

我见过的最好的(尽管最烦人的)版本是你需要记住一个秘密问题一个秘密答案的地方。这意味着用户必须记住他们提出的问题,当然,也总是可以忘记的!

如果他们忘记了这个问题并且您是一家“真正的”公司,则始终可以选择通过帖子向用户发送令牌,并提供有关如何重置其所有安全性的说明……黑客不太可能获得访问权限到他们现实生活中的邮件。

一个偏差是在用户创建帐户时收集电话号码。如果存在这种情况并且他们不记得他们的任何详细信息,您可以设置某种自动呼叫系统,告诉他们如何重置他们的详细信息。

还有一件事要提到#2:不要让进程覆盖当前帐户密码。如果发生这种情况,任何人都可以说他们忘记了任何帐户的密码,从而引发大量不必要的密码更改。

于 2009-05-23T14:57:34.763 回答
4

选项 1 或 2 的安全性没有真正的区别。选项 1 实际上与在表单中预加载新密码相同。

事实上,随着网络钓鱼攻击的盛行,有人可能会争辩说,鼓励使用带有长 URL 的选项 1 可能会使人们对点击长而神秘的 URL 的警惕性降低。

于 2009-05-23T14:45:18.157 回答
4

阅读OWASP 前十名以确保您的方法符合要求。

是直接链接。

于 2009-05-23T14:47:03.940 回答
4

只是快速说明一些与您的问题无关的内容。您提到您使用 MD5 对存储的密码进行哈希处理。无论您选择使用选项 1 还是 2(3 将是最不安全的,因为显而易见的原因),MD5 是一种破解的哈希算法,实际上可以让黑客相当容易地访问受保护的帐户MD5 哈希。

您可以在以下 URL 阅读有关该漏洞的更多信息:en.wikipedia.org/wiki/MD5

更好的散列解决方案是类似于 SHA,它仍然是一种稳定且安全的散列算法。结合选项 #1 或 #2,您应该有一个相当安全的系统来保护您的用户密码,除了最坚定的黑客之外的所有人。

于 2009-05-23T16:49:01.523 回答
2

选项#1 可能是最好的。#3 是不安全的(我还建议使用比 MD5 更强大的东西,例如 SHA1)。选项 #2 不好,因为它允许任何随机的人将您锁定在您的帐户之外,直到您检查您的电子邮件,除非您使用安全问题。安全问题通常比密码更容易破解。

于 2009-05-23T14:54:07.653 回答
2

选项#1 与#2 相比有几个主要优点。如果随机用户在“我忘记密码”框中输入我的电子邮件地址,我的密码将不会被重置。此外,它稍微更安全一点,因为网站密码没有永久记录在您的 gmail 收件箱中。

这里缺少的一个关键部分是您在 #1 中提供的链接仅适用于一次密码重置并且有时间限制

所有这些解决方案意味着您将您的电子邮件收件箱视为统治所有这些的“一环”。无论如何,大多数在线服务现在似乎都在这样做。

我的首选方法是尽可能使用 openid。密码管理是地狱,似乎没有人完全正确。把这个问题交给别人更容易。

于 2009-05-23T20:24:44.817 回答
1

我同意您关于选项 #3 不安全的评论。

至于编程#1 或#2,选项#2 更容易编程,但#1 并不难,两者可能彼此一样安全。

无论您选择哪个选项,您还可以考虑通过将个人信息请求(您在注册期间获得)作为忘记密码过程的一部分来提高安全性。

我已经对系统进行了编程,其中您有一个用户名,并且要获得一个新密码,您必须输入您的用户名和您的电子邮件地址。您可以收到有关您的用户名的提醒,但要点是有人可能无法猜出您的用户名和电子邮件,但如果您仅通过电子邮件进行猜测,则安全性较低。

秘密问题是一种处理个人信息部分的方法。我个人认为它们没有提供太多价值,因为人们倾向于选择许多人知道答案、能够猜测或能够找出答案的问题。但是,只要您将它与已经相对安全的方法结合使用,总比没有好。

显然,你做的越多,编程工作就越多。

最简单的方法是:

  1. 有一个“提醒我我的用户名”链接(输入电子邮件)。不要告诉用户是否发送了电子邮件,因为人们可以使用它来确定电子邮件地址是否属于成员。始终告诉用户检查他们的收件箱以获取提醒电子邮件,但仅在某人是会员时才发送;和
  2. 需要用户名和电子邮件才能收到新的一次性密码。该密码应该只持续一个小时左右。当用户使用它时,他们应该被强制立即更改他们的密码。
于 2009-05-23T14:48:12.753 回答
1

选项 4:要求用户通过输入其帐户名和电子邮件地址来重置密码。只要您不在网站上披露真实姓名或电子邮件地址(为什么您会在这个时代?),这是一种相当安全且防篡改的方法。发送指向重置页面的链接,而不是密码本身。

选项 5:使用OpenID并将责任转交给第三方来担心它。

老实说,尽管这比大多数网站需要的努力要多得多。我喜欢通过电子邮件接收明文密码,因为我将它们存储在收件箱的“注册”文件夹中。这样我就可以在我忘记网站密码时查找它们(这种情况经常发生!)。如果有人正在阅读我的电子邮件,那么我需要担心的问题比使用我的 Twitter 帐户(如果我有的话)的人要担心的多。当然银行和公司有更严格的要求,但你没有具体说明你的网站是什么。这是最佳答案的关键。

于 2009-05-23T15:11:03.487 回答
0

选项1或2都可以。正如您所说,选项 3 是不安全的,因为您需要存储明文密码。您可能会喜欢并使用可逆加密算法来存储/检索密码,但是有更好的替代方案可供您使用,没有理由走这条路。

于 2009-05-23T14:48:35.467 回答
0

您可以将一个附加选项与您提到的任何选项结合使用:

您可以让用户为他们的密码写一个提醒,当他们忘记密码时,您可以作为第一步发送给他们。如果提醒对用户没有帮助,您可以继续下一个选项。

由于提醒不是密码本身,因此通过邮件发送是安全的(甚至可能直接显示在页面上)。

于 2009-05-23T14:50:20.407 回答
0

如果您正在对它们进行散列,则选项 3 不可用,并且如果您没有对它们进行散列,那么您会感到羞耻。:)

我更喜欢选项 1,将重置密码链接发送到他们的电子邮件,允许他们(在有限的时间内)重置密码。它确实需要更多的工作,但对他们来说很容易使用,并且最终与他们的电子邮件登录过程一样安全。

于 2009-05-23T14:51:21.967 回答
0

您可以在 #1 和 #2 之间进行混合,同时利用两者的优势:

向用户发送一封电子邮件,其中包含指向唯一隐藏 URL 的链接,该 URL 允许他更改随机生成的新密码。

该页面可能是 SSL,密码可能会在 12-24 小时内过期。

于 2009-05-23T15:01:42.007 回答
0

我尝试了几种我不太满意的方法。我对下一个项目的决定是:

  1. 用户输入用户名和电子邮件地址
  2. 带有包含 url 和 guid 参数的链接的电子邮件已存储在 db 中,有效期为 48 小时
  3. 用户确认要重置的密码
  4. 新密码通过电子邮件发送给用户
  5. 使用新密码登录会显示消息或重定向到更改密码页面。
于 2010-07-01T21:21:52.253 回答
0

指示用户亲自到您的办公室,并用身份证或护照证明她的身份。

当然,这假设您在用户附近设有办事处,并且该帐户的价值足以证明此过程的合理性。适用于例如银行。

于 2010-08-19T08:49:09.790 回答