实施密码恢复最佳实践

问题描述 投票:60回答:12

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

我想避免使用秘密问题。

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

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

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

passwords password-recovery forgot-password
12个回答
48
投票

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

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


1
投票

@Jay。正确使用安全问题是启动密码重置电子邮件,而不是实际重置密码。如果没有安全问题等机制,可以启动密码重置。虽然似乎是beign,但发送重置电子邮件可能会发送到可能不再属于原始所有者的电子邮件。这并不罕见。例如,当员工离开公司时,通常会将这些邮件转发给其他员工。一个安全问题,为这种情况增加了低水平的劝告。它还可以减少一个人在错误的帐户上启动密码重置的问题,从而导致一些不良的草皮被无意中发送垃圾邮件。安全问题实际上并不意味着真正安全,它们只是为了减少这些情况。任何使用安全问题来实际重置密码的人都做错了。


0
投票

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

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


0
投票

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

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


84
投票

当我在空军时,我们的安全规则是:设置或重置密码时,请勿在同一封电子邮件中发送用户ID和密码。这样,如果有人拦截窃听密码的电子邮件,他必须成功拦截两部电子邮件,并能够连接它们,以破坏安全性。

我见过很多使用“转到此URL重置密码”的网站。也许我错过了一些东西 - 我并不认为自己是安全专家 - 但我不知道这比仅仅发明一个新的临时密码并发送它更安全。如果黑客拦截了该电子邮件,为什么他不能访问该链接并看到新密码以及合法用户可以?在我看来,对于没有安全保障的用户来说,这是一件额外的麻烦。

顺便说一句,祝贺你不使用安全问题。这个设备的逻辑逃脱了我。自从计算机安全问世以来,我们一直在告诉人们,“不要输入密码,黑客可以发现或猜测自己的信息,比如你的高中名字,或者你喜欢的颜色。黑客也许能够查看你高中的名字,或者即使他们不认识你或了解你的任何事情,如果你仍住在你上学的地方附近,他们可以通过尝试当地学校直到他们去学校来获得它。少数可能最喜欢的颜色,所以黑客可以猜测。等等,密码应该是字母,数字和标点符号的无意义组合。但是现在我们也告诉他们,“但是!如果你很难记住字母,数字和标点符号的无意义组合,那就没问题!拿一些你可以轻松记住的关于你自己的信息 - 就像你的高中名字一样或者你最喜欢的颜色 - 你可以用它作为'安全问题'的答案,也就是说,作为另一种密码。“

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

我们不是要使用安全问题,为什么不说“如果您忘记了密码,它会显示在屏幕的底部。如果您试图入侵其他人的帐户,则绝对禁止您向下滚动。“它只会稍微不那么安全。

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

</咆哮>


20
投票

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

但是,你不应该做的事情:

  • 发送密码 - 毕竟,正如已经提到的那样,你没有密码。
  • 生成一个新的临时密码 - 这不仅与发送密码不安全,还会导致拒绝服务攻击的可能性。我可以去网站,假装是你,请求一个新密码,然后(如果你没有检查过你的电子邮件)你无法登录,不知道为什么,并且必须要求一个新的密码.. 。

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

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


10
投票

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


5
投票

我不理解对秘密问题方法的态度。这不像我要将我的密码设为“BlueHouse”,然后提出我的安全问题“你最喜欢的两件事是什么?”和答案“蓝色和房屋”。安全问题不是获取实际密码的神奇钥匙。这通常是一种将新密码发送到文件中的电子邮件地址的方法。我不知道你们怎么做,但听起来你做了两件事之一。

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

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

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

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


5
投票

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

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

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

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

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


4
投票

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

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

关于令牌的观点,我认为它不会对整体安全性产生重大影响。您是否发送允许用户更改密码的令牌,或者您是否立即发送随机密码并没有太大的区别。

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

并且,正如之前的答案所指出的,永远不会存储普通密码。哈希他们。最好加入salt


3
投票

这是我如何解决它:

我在我的'用户'表中添加了retrieve_tokenretrieve_expiration字段。

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

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

需要身份验证时,SSL必须是必需的。您还可以添加用于记录存储电子邮件和IP地址的重置请求的表。它有助于追踪可能的暴力攻击,如有必要,您可以阻止攻击者的IP。

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


2
投票

@Jay。您转到URL重置密码而不是仅向某人发送新临时密码的原因不仅仅是安全性。如果没有带有令牌的URL,则某人可以重置其他人的密码。无需访问电子邮件。如果某人有人可以选择某人,他们可以继续启动新密码重设。然后,可怜的目标必须一次又一次登录并更改密码。

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

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

© www.soinside.com 2019 - 2024. All rights reserved.