实施密码恢复最佳实践

Enr*_*que 62 passwords forgot-password password-recovery

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

我想避免使用秘密问题.

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

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

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

Jay*_*Jay 85

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

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

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

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

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

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

</咆哮>

  • +1对于为什么安全问题不好而最令人愉快的咆哮. (40认同)
  • "转到此URL以重置密码." 在您到达目的地后,请提供您的用户名,该用户名不包含在电子邮件中,并且令牌将在一小时内到期.这比临时密码更安全,因为如果您没有提出请求,它不会将您锁定在帐户之外.黑客必须知道您的用户名和电子邮件地址,并且在令牌有效的时间范围内可以访问后者.当然,这假设网站没有使用您的电子邮件地址作为您的用户名... (19认同)
  • 我总是为那些可怕的"安全"问题选择模糊的答案.我的无线服务提供商通过电话恢复密码时遇到了一个尴尬的时刻.他们问了我设置的一个安全问题:"你最喜欢的食物是什么?",我回答说:"我自己"......"嗯,好吧Murch先生非常感谢你." (7认同)
  • 如果您为他们发送新密码以访问该站点,则可以在路上截获该密码,如果用户自事件发生以来尚未更改其密码,则该密码仍然有效.使用服务器端生成的令牌允许您(站点所有者)通过到期时更好地控制何时能够使用该入口点. (5认同)
  • @Wesley:情况可能会更糟.你可以说,"帮助台人".不过不错.一个荒谬的答案很容易记住,但有人猜测的可能性较小.只要你不选择明显荒谬的答案.问:Q:"你去哪儿上学?" 答:"硬敲". (2认同)

Kit*_*une 49

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

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

  • @CoryGross你可以通过各种方式解决这个问题,但你绝对不希望链接以任何方式公开电子邮件或传递/哈希.一个相当简单的选项是数据库中的附加表,具有用户ID列(唯一),请求数据列和*随机生成的*值(128位是安全值).随机生成的值将嵌入电子邮件中的链接中.reset-pass页面将确保它获得的数字在数据库中,日期在X天内.此时,您可以为用户请求新密码.定期修剪. (5认同)

Dun*_*can 20

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

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

  • 发送密码 - 毕竟,正如已经提到的那样,你没有密码.

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

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

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


Mat*_*hen 10

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

  • 实际上没有充分的理由以可逆的格式存储密码,并且可能使用这样的对称算法会增加零额外的安全性,同时仅添加错误的安全感.使用适当的哈希算法,例如SHA系列之一,或漩涡,或其他现代哈希算法,使用salt,密码将更加安全. (12认同)
  • 使用加密存储密码是有帮助的,但还不够 - 如果攻击者可以访问您的数据库,那么他也很有可能访问系统的其余部分(对于SQL注入不是这样,但对于许多其他类型的攻击).如果您的系统可以解密密码,那么他也可以. (11认同)
  • 即使外部攻击不太可能,内部总有可能存在邪恶.你们其中一个同事可能只是解密密码,甚至可能卖掉它们.这就是你应该只使用哈希的原因. (4认同)
  • Kitsune是正确的.如果您的数据库遭到入侵,那么您的AES密钥很可能也会被破坏.您应始终对密码使用单向加密哈希. (3认同)

小智 5

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

1)用户点击"我忘记密码"按钮,新密码被发送给用户.

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

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

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

  • "在我看来,2号选项更安全"......是的,但只是微不足道,它会激怒用户,他们会忘记答案. (2认同)

mik*_*ato 5

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

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

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

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

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