实施密码恢复最佳实践
我想在我的web应用程序中实现密码恢复。
我想避免使用秘密的问题。
我可以通过电子邮件发送密码,但我认为这是有风险的。
也许我可以生成一个新的临时随机密码,并通过电子邮件发送,但我认为这与上述点一样危险。
我可以通过电子邮件发送url,例如http://example.com/token=xxxx ,其中xxxx是与用户关联的随机令牌。 所以当用户导航到这个url时,他/她可以重置密码。
首先,不要存储用户密码的纯文本副本,甚至不要encryption版本。 您只想保留用户密码的散列副本。
至于恢复解决scheme,我发现恢复链接来改变用户的密码是我的经验最好的解决scheme。 对于用户来说,这可能会更方便一些,而从安全angular度来看,在下次login后发送一个新的随机密码将被改变,这在很大程度上是相同的。 我仍然build议恢复url在合理的短时间内过期,以及只能使用一次。
当我在空军的时候,我们的安全规则是:在设置或重置密码时,不要在同一封电子邮件中发送用户名和密码。 这样,如果有人拦截电子邮件窃听密码,他必须成功拦截这两个电子邮件,并能够连接它们,以破坏安全。
我见过很多使用“转到此URL重置密码”的网站。 也许我错过了一些东西 – 我不认为自己是安全专家 – 但是我不明白这比发明一个新的临时密码和发送更安全。 如果一个黑客拦截了电子邮件,为什么他不能去那个链接,并看到新的密码以及合法用户可以? 在我看来,对于用户来说,没有任何安全方面的额外麻烦。
顺便说一下,恭喜你不要使用安全问题。 这个设备的逻辑逃避了我。 自从计算机安全曙光以来,我们一直在告诉人们:“不要设置一个黑客可以发现或猜测的信息,比如你的高中名字,或者你喜欢的颜色,黑客也许可以要查找你的高中的名字,或者即使他们不了解你,也不了解你的任何事情,如果你仍然住在你上学的地方,他们可能会尝试当地的学校,直到他们碰到它。less数可能最喜欢的颜色,所以黑客可以猜测,等等,而密码应该是字母,数字和标点符号的无意义组合。 但现在我们也告诉他们:“但是,如果你记住字母,数字和标点符号的无意义的组合,那就没有问题了!记下一些你可以很容易记住的信息 – 比如你的高中名字,或者你喜欢的颜色 – 你可以用它作为“安全问题”的答案,也就是作为一个替代密码。
事实上,安全问题使得黑客比如果你刚select一个错误的密码更容易。 至less如果您只是使用一个个人信息作为您的密码,黑客就不一定知道您使用了哪些个人信息。 你使用了你的狗的名字吗? 你的出生date? 你最喜欢的冰淇淋味道? 他必须尝试所有这些。 但是有了安全的问题,我们告诉黑客究竟是什么个人信息作为密码!
为什么不用安全的问题呢,为什么我们不说:“如果你忘记了密码,它会显示在屏幕的底部,如果你想侵入别人的账户,那么你绝对禁止向下滚动“。 这只会稍微不安全。
免得你想知道,当网站要求我出生的城市或我的第一辆汽车的制造商时,我并没有给出实际的答案。 我给一个毫无意义的密码。
</咆哮>
很难说你应该做什么,几乎任何解决这个问题的办法都会削弱安全性。 除非可能要调查发送短信,回叫validation,一次性密码生成器或其他此类将密码恢复到不同介质的scheme。
但是,你不应该这样做 :
-
发送密码 – 因为毕竟,已经提到,你没有它。
-
生成一个新的临时密码 – 不仅如此,发送密码不安全,还会导致拒绝服务攻击。 我可以去网站,假装是你,请求一个新的密码,然后(如果你还没有检查你的电子邮件),你不能login,不知道为什么,不得不要求一个新的新密码.. 。
令牌可能是要走的路。 收到通知忘记密码请求,但不采取任何行动,除非你确认。 你也可以把它作为一个有一个相对短的到期时间来限制风险的一次性令牌。
当然,很多取决于应用程序。 显然,保护财务信息和其他敏感信息比防止你的帐户在mytwitteringfacetube.com被黑客攻击更为重要,因为虽然不方便,但如果有人想要在某个社交网站上窃取某人的身份,他们可以自己开户并伪装成被盗信息无论如何。
显然,你不能通过电子邮件发送原始密码,因为你没有存储它(对吧?!)。 发送临时密码(必须更改,因为它仅适用于一次login),并且从安全angular度来看,重设密码的链接是相同的。
我不理解对秘密问题方法的态度。 这不像我要把我的密码“BlueHouse”,然后让我的安全问题“你最喜欢的两件事是什么?” 和“蓝色和房屋”的答案。 安全问题不是获取实际密码的魔法关键。 这通常是一种将新密码发送到文件中的电子邮件地址的方法。 我不知道你们是怎么做的,但是听起来像你做了以下两件事之一。
1)用户点击“我忘记了我的密码”button,新密码发送给用户。
2)用户点击“我忘记了我的密码”button,然后必须回答一个安全问题,然后再通过电子邮件将新密码发送到文件中的地址。
在我看来,选项2更安全。
为什么发送令牌比发送密码更安全? 如果一个电子邮件帐户被黑客入侵,它已被黑客入侵。 是否有链接重置密码,令牌或新密码并不重要。 不要忘记,大多数网站不会说“新密码已经发送到下面的电子邮件地址,你可以入侵”。 黑客需要猜测需要被黑客攻击的电子邮件地址。
我同意安迪。 安全问题通常不是独立于密码的吗? (我的)意思是他们有一个问题和一个答案,而且与密码无关。 这似乎是用来防止虚假密码重置请求,实际上有用。
想象一下 – 有人可能会去一个网站的“忘记密码”工具,并input数十亿个电子邮件地址 – 或者只是一个他们想要惹恼的人。 如果密码重置,那么属于这些电子邮件地址的人们将不得不在他们的电子邮件中通知密码重置,并在他们下次去那里时使用重置密码login到站点。 有了安全问题,这对于某人来说并不容易。
我看到亚马逊发送一个链接到给定的电子邮件。 他们还要求您inputvalidation码以防止DOS攻击。 因为这是一个链接,我想这意味着他们没有立即重置密码,一旦用户点击链接就会重置。 在上面的情况下,用户只会看到电子邮件,并注意到“不,我没有这样做”,而不必不经意地更改自己的密码。 一个安全问题可能阻止了开始时的尝试,并且合法用户首先得到电子邮件。
这是一个白皮书: http : //appsecnotes.blogspot.com/2010/09/latest-forgot-password-best-practices.html
这其中实际上build议秘密的问题作为validation过程的主要部分。 并通过电子邮件发送validation码,并请求它只是一个附加层,你可以select包括。
这真的归结为你想要有多less安全。 极端的一个方面是密码重置过程,涉及通过联系和certificate您是您自称的人,例如通过身份证,因为您的邮箱也可能受到威胁。 实际上,由于人们往往在任何地方都使用相同的密码,所以这很可能。 另一方面是标准的方法,只需发送一个随机的新密码的电子邮件。
“秘密”的问题和答案只是用户名和密码的另一种forms,带有致命的缺陷,他们通常难以置信地容易猜到,太好了,你不想使用它们。
关于这个标记,我认为这对整体安全没有太大的影响。 无论您发送允许用户更改密码的令牌,还是立即发送随机密码,都没有太大区别。
只要确保令牌只能使用一次,最好只在有限的时间范围内使用,例如请求后24小时。
而且,正如以前的答复所指出的,永远不要存储简单的密码。 哈希他们。 最好join盐 。
以下是我解决它的方法:
我将retrieve_token
和retrieve_expiration
字段添加到我的“用户”表中。
用户通过提供他们的电子邮件并填写validation码来请求重设密码。 为其retrieve_token
字段(即md5($user_id.time())
生成随机哈希值,而retrieve_expiration
将被设置为在接下来的45分钟内过期的date时间。 电子邮件通过链接发送给用户:
https://example.com/reset-password?retrieve_token=912ec803b2ce49e4a541068d495ab570
当需要authentication时,SSL应该是强制性的。 您还可以添加一个表来logging存储电子邮件和IP地址的重置请求。 它有助于追踪可能的暴力攻击,并在必要时阻止攻击者的IP。
你可以实现请求重置密码的安全问题,但我觉得validation码就足以阻止任何人重复请求多次。
@Jay。 你为什么去一个URL来重置你的密码,而不是发送一个新的临时密码不仅仅是安全。 如果没有像令牌一样的URL,一个人可能会重置另一个人的密码。 没有必要访问电子邮件。 如果有人有骨头挑选某人,他们可能会继续启动一个新的密码重置。 那么可怜的目标必须一次又一次地login并更改密码。
通过发送令牌,用户的密码不会改变,直到他们login并确认。 重置电子邮件的垃圾邮件可以被忽略。 通过使用GUID,令牌同样容易(如果不是那么容易)生成一个新的密码,这对开发人员来说并不是什么额外的麻烦。
另外,因为GUID是唯一的(生成的密码可能不是),所以令牌可以绑定到用户名。 如果在URL上给出了不正确的用户名,那么令牌可以被取消(即,当不同的人启动它并且有人拦截它时,假定用户名与电子邮件不相同)。
@Jay。 正确使用安全问题是启动密码重置电子邮件,而不是实际重置密码。 如果没有安全问题等机制,可以启动密码重置。 虽然看起来很卑鄙,但发送重置电子邮件可能会发送到可能不再属于原始所有者的电子邮件。 这并不罕见。 例如,当员工离开公司时,往往这些邮件被转发给另一个员工。 一个安全问题,在这种情况下增加了一个低水平的obfucation。 它还可以减less一个人不断启动密码重置在错误的帐户,导致一些可怜的草皮无意间发送垃圾邮件的问题。 安全问题实际上不是真正安全的,它们只是为了减less这种情况。 任何使用安全问题来重置密码的人都是错误的。
关于安全问题/答案。 作为网站的用户,我个人不使用它们(我在其中input垃圾)。 但是,正如有人在这里所说的那样,它们当然不是无用或无意义的。
考虑这种情况:您的网站的用户已经离开他的桌子去吃午饭,并没有locking他的工作站。 恶意用户现在可以访问该页面来恢复/重置密码并input用户的用户名。 系统将通过电子邮件发送恢复/重置密码,而不会提示安全答案。
下面是一个人们如何用Node.js做的例子,基本上生成一个随机的令牌,到期时间,发送链接与附加的令牌,有一个reset/:token
路由,确保用户与该令牌存在(这是也没有过期),如果是的话,redirect到一个重置密码页面。
http://sahatyalkabov.com/how-to-implement-password-reset-in-nodejs/