63

我想在我的 Web 应用程序中实现密码恢复。

我想避免使用秘密问题。

我可以通过电子邮件发送密码,但我认为这样做有风险。

也许我可以生成一个新的临时随机密码并通过电子邮件发送,但我认为这与上述几点一样有风险。

我可以通过电子邮件发送一个 URL,例如http://example.com/token=xxxx ,其中 xxxx 是与用户关联的随机令牌。因此,当用户导航到该网址时,他/她可以重置密码。

4

12 回答 12

86

当我在空军时,我们的安全规则是:设置或重置密码时,不要在同一封电子邮件中发送用户 ID 和密码。这样一来,如果有人截获窥探密码的电子邮件,他必须成功截获两封电子邮件,并能够连接它们,从而破坏安全性。

我见过很多使用“转到此 URL 来重置密码”的网站。也许我遗漏了一些东西——我不声称自己是安全专家——但我看不出这比发明一个新的临时密码并发送它更安全。如果黑客拦截了电子邮件,为什么他不能像合法用户一样访问该链接并查看新密码?在我看来,这对于没有安全收益的用户来说是额外的麻烦。

顺便说一句,恭喜你没有使用安全问题。这个设备的逻辑让我无法理解。自从计算机安全问世以来,我们一直在告诉人们,“不要设置黑客可以发现或猜到的关于您自己的信息的密码,例如您的高中名称或您最喜欢的颜色。黑客可能能够查找您高中的名称,或者即使他们不认识您或对您一无所知,如果您仍然住在您上学的地方附近,他们可能会通过尝试当地学校直到他们找到它。少数可能喜欢的颜色,以便黑客可以猜到。等等。相反,密码应该是字母、数字和标点符号的无意义组合。但现在我们也告诉他们,“但是!如果您很难记住字母、数字和标点符号的无意义组合,没问题!获取一些你容易记住的关于你自己的信息——比如你高中的名字,或者你最喜欢的颜色——你可以用它来回答“安全问题”,也就是作为替代密码。”

事实上,安全问题让黑客更容易比您选择一个错误的密码开始。至少如果您只是使用了一条个人信息作为密码,黑客不一定知道您使用了哪条个人信息。你用了你的狗的名字吗?你的出生日期?你最喜欢的冰淇淋口味?他必须尝试所有这些。但是对于安全问题,我们会告诉黑客您使用了哪些个人信息作为密码!

与其使用安全问题,不如直接说:“如果您忘记密码,它会显示在屏幕底部。如果您试图入侵他人的帐户,绝对禁止您向下滚动。” 它只会稍微不那么安全。

以免您想知道,当网站询问我出生的城市或我的第一辆汽车的制造商时,我不会对这个问题给出实际答案。我给了一个无意义的密码。

</rant>

于 2010-04-29T04:11:49.220 回答
51

首先,不要存储用户密码的纯文本副本,甚至是加密版本。您只想保留用户密码的散列副本。

至于恢复解决方案,我发现更改用户密码的恢复链接是我经验中最好的解决方案。这对用户来说可能会更方便一些,同时从安全的角度来看,它与发送一个新的随机密码在下次登录后进行更改基本相同。我仍然建议让恢复网址在合理的短时间内过期,并且只能使用一次。

于 2010-04-29T02:13:21.510 回答
20

很难说你该做什么,因为这个问题的任何解决方案都会削弱安全性。除非您可能想调查发送 SMS、回调验证、一次性密码生成器或其他将密码恢复到不同介质的此类方案。

但是,您不应该做的事情

  • 发送密码 - 因为毕竟,正如已经提到的,你没有它。

  • 生成一个新的临时密码——这不仅与发送密码一样不安全,还可能导致拒绝服务攻击。我可以去该网站,假装是你,请求一个新密码,然后(如果你没有检查你的电子邮件)你无法登录,不知道为什么并且不得不请求一个新的新密码.. .

令牌可能是要走的路。收到它会通知忘记密码请求,但除非您确认,否则不会采取任何行动。您还可以将其设为到期时间相对较短的一次性代币以限制风险。

当然,很大程度上取决于应用程序。显然,保护财务和其他敏感信息比防止您的帐户在 mytwitteringfacetube.com 上被黑客入侵更为重要,因为虽然不方便,但如果有人想在社交网站上窃取某人的身份,他们可以打开自己的帐户并伪装成被盗反正信息。

于 2010-04-29T05:08:44.710 回答
10

显然,您不能通过电子邮件发送原始密码,因为您没有存储它(对吗?!)。从安全的角度来看,发送临时密码(必须更改,因为它仅适用于一次登录)和重置密码的链接是等效的。

于 2010-04-29T02:12:33.133 回答
5

我不明白对密问法的态度。这不像我要让我的密码“BlueHouse”,然后让我的安全问题“你最喜欢的两件事是什么?” 和答案“蓝色和房子”。安全问题不是获取实际密码的万能钥匙。这通常是一种将新密码发送到存档电子邮件地址的方法。我不知道你们是怎么做的,但听起来你做了两件事之一。

1) 用户单击“我忘记了密码”按钮,新密码将发送给用户。

2) 用户单击“我忘记了密码”按钮,然后必须回答一个安全问题,然后才能将新密码通过电子邮件发送到文件中的地址。

在我看来,选项 2 更安全。

为什么发送令牌比发送密码更安全?如果电子邮件帐户被黑客入侵,则它已被黑客入侵。是否有重置密码、令牌或新密码的链接都没有关系。不要忘记,大多数网站不会说“新密码已发送到以下电子邮件地址供您破解”。黑客需要猜测需要被黑客入侵的电子邮件地址。

于 2011-03-16T17:48:34.143 回答
5

我同意安迪的观点。安全问题通常不是独立于密码的吗?(我的是)意味着他们有一个问题和一个答案,并且与密码无关。似乎这用于防止虚假的密码重置请求,实际上确实有用。

想象一下——有人可以去一个网站的“忘记密码”实用程序并输入无数的电子邮件地址——或者只是一个他们想要惹恼的人。如果此时密码被重置,属于这些电子邮件地址的人必须在他们的电子邮件中注意到密码重置,并在下次去那里时使用重置密码登录该站点。对于安全问题,这对某人来说并不容易。

我看到亚马逊发送了一个指向给定电子邮件的链接。他们还要求您输入验证码以防止 DOS 攻击。因为它是一个链接,我想这意味着他们没有立即重置密码,一旦用户点击链接就会重置密码。在上面的场景中,用户只会看到电子邮件并注意到“不,我没有这样做”,然后继续他们的业务,而不必不必要地更改密码。安全问题可能在一开始就阻止了尝试,并且合法用户首先无法收到电子邮件。

这是关于它的白皮书:http: //appsecnotes.blogspot.com/2010/09/latest-forgot-password-best-practices.html

这实际上建议将秘密问题作为身份验证过程的主要部分。通过电子邮件发送验证码并请求它只是您可以选择包含的附加层。

于 2011-04-20T15:57:43.500 回答
4

这实际上取决于您想要拥有多少安全性。一个极端的一端是密码重置过程,该过程涉及联系并证明您就是您声称的身份,例如通过 id,因为您的邮箱也可能被盗用。实际上,由于人们倾向于在任何地方使用相同的密码,这很有可能。另一方面,标准方法只涉及发送一封带有随机新密码的电子邮件。

“秘密”问题和答案只是用户名和密码的另一种形式,具有致命缺陷,它们通常非常容易猜到,好到你不想使用它们。

就您关于令牌的观点而言,我认为它对整体安全性没有太大影响。无论您是发送一个允许用户更改密码的令牌,还是您是否立即发送一个随机密码,都没有太大的区别。

只需确保令牌仅可使用一次,最好仅在有限的时间跨度内使用,例如在请求后 +24 小时。

而且,正如之前的答案所指出的,永远不要存储纯密码。哈希它们。最好加盐

于 2010-04-29T02:50:12.060 回答
3

这是我解决它的方法:

我在“用户”表中添加了retrieve_token和字段。retrieve_expiration

用户通过提供他们的电子邮件并填写验证码来请求重置密码。为其retrieve_token字段生成一个随机散列值 - 即md5($user_id.time())retrieve_expiration将设置为在接下来的 45 分钟内到期的日期时间。电子邮件通过链接发送给用户:

https://example.com/reset-password?retrieve_token=912ec803b2ce49e4a541068d495ab570

当需要身份验证时,SSL 应该是强制性的。您还可以添加一个表来记录存储电子邮件和 IP 地址的重置请求。它有助于追踪可能的暴力攻击,并且您可以在必要时阻止攻击者的 IP。

您可以为请求密码重置实施安全问题,但我觉得验证码足以阻止任何人多次重复请求。

于 2013-12-06T23:48:28.050 回答
2

@杰伊。您转到 URL 来重置密码而不是仅仅向某人发送新的临时密码的原因不仅仅是安全性。如果没有带有令牌的 URL,一个人可以重置另一个人的密码。无需访问电子邮件。如果有人想找人挑剔,他们可以继续发起新的密码重置。然后可怜的目标不得不一次又一次地登录和更改密码。

通过发送令牌,用户的密码在他们使用它登录并确认之前不会更改。可以忽略重置电子邮件的垃圾邮件。令牌与使用 GUID 生成新密码一样容易(如果不是更容易的话),这对开发人员来说并不是真正的额外麻烦。

此外,由于 GUID 是唯一的(生成的密码可能不是),因此可以将令牌绑定到用户名。如果在 URL 上提供了不正确的用户名,则可以取消令牌(即,当另一个人启动它并且有人拦截它时......假设用户名与电子邮件不同)。

于 2013-07-24T07:07:51.490 回答
1

@杰伊。安全问题的正确使用是启动密码重置电子邮件,而不是实际重置密码。如果没有诸如安全问题之类的机制,则可以启动密码重置。虽然看起来很正常,但发送重置电子邮件可能会发送到可能不再属于原始所有者的电子邮件。这并不罕见。例如,当员工离开公司时,这些邮件通常会转发给另一位员工。一个安全问题,为该场景增加了低级别的混淆。它还减少了一个人不断在错误的帐户上启动密码重置导致一些糟糕的草皮无意中发送垃圾邮件的问题。安全问题实际上并不意味着真正安全,它们只是为了减少诸如此类的情况。

于 2013-07-24T06:39:55.723 回答
0

关于安全问题/答案。作为网站的用户,我个人不使用它们(我在其中输入垃圾)。但它们肯定不是像这里有些人所说的那样无用或毫无意义。

考虑这种情况:您站点的用户离开办公桌去吃午饭并且没有锁定他的工作站。恶意用户现在可以访问恢复/重置密码的页面并输入用户的用户名。然后系统将通过电子邮件发送恢复/重置的密码,而不提示您提供安全答案。

于 2013-04-19T00:15:12.677 回答
0

这是某人如何使用 Node.js 进行操作的示例,基本上生成一个随机令牌,一个到期时间,发送带有令牌的链接,具有reset/:token确保用户使用该令牌存在的路由(也未过期)如果是这样,请重定向到重置密码页面。

http://sahyalkabov.com/how-to-implement-password-reset-in-nodejs/

于 2014-08-18T16:45:25.700 回答