我在寻找实施“忘记密码”功能的最佳方法。
我拿出2点的想法:
当用户点击忘记密码,用户需要在用户名,电子邮件和出生或名字的可能日期键。 然后用临时密码的邮件将发送到用户的电子邮件帐户。 用户使用临时密码登录并重置其密码。
类似的,但是该电子邮件将包含一个链接,让用户重置其密码。
或任何人可以建议我一个更好的和安全的方式? 我也想发送的临时密码或链接,迫使用户24小时内重置密码,否则临时密码或链接将无法使用。 怎么做?
我在寻找实施“忘记密码”功能的最佳方法。
我拿出2点的想法:
当用户点击忘记密码,用户需要在用户名,电子邮件和出生或名字的可能日期键。 然后用临时密码的邮件将发送到用户的电子邮件帐户。 用户使用临时密码登录并重置其密码。
类似的,但是该电子邮件将包含一个链接,让用户重置其密码。
或任何人可以建议我一个更好的和安全的方式? 我也想发送的临时密码或链接,迫使用户24小时内重置密码,否则临时密码或链接将无法使用。 怎么做?
更新:2013年5月修订了一个更好的办法
password_change_requests
与列ID
, Time
和UserID
。 当新用户按下按钮,记录在表中创建。 该Time
列包含当用户按下“忘记密码”按钮的时间。 该ID
是一个字符串。 长随机数序列创建(也就是说,一个GUID),然后像哈希密码 (这是一个单独的话题,本身)。 然后该散列被用作该表中的“ID”。 http://www.mysite.com/forgotpassword.jsp?ID=01234567890ABCDEF
。 该forgotpassword.jsp页面应该能够找回ID参数。 对不起,我不知道Java的,所以我不能更具体。 ID
从URL,再散列它,和对阵表检查。 如果这样的记录是存在的,并不比,比如说24小时老越多,用户呈现提示输入新的密码 。 这一切都取决于你的网站,你正在努力实现但对于一个Web应用程序的基本过程进行类似下面的安全级别:
用户导航到“忘记密码”页面,输入自己的用户名或电子邮件(无论是唯一的),以请求重置密码。
可选择在这个阶段,你可以确认通过询问其他信息,如回答一个预定义的安全问题或自己的出生等,这额外级别的日期要求停止接收用户,他们没有要求电子邮件。
查找用户的帐户。 保存临时密码(通常是一个GUID)和时间戳对帐户记录。 发送电子邮件至包含临时密码的用户。
包含在电子邮件中的临时密码和用户的标识符或链路上的用户或者点击导航到“忘记密码”页面,然后复制粘贴和临时密码和自己的标识。 用户输入新密码并确认它。
查找用户的记录,如果当前时间是在规定的时间期限内保存在步骤2中的时间戳(例如1小时),然后散列并保存新的密码。 (显然,只有当临时密码匹配!)。 删除临时GUID和时间戳。
这里主要是用户通过电子邮件发送,它可以让他们改变密码临时密码。 原先存储的密码(应该散列!)永远不会改变的情况下,用户会记住一个临时密码。
原来的密码不会被显示给用户,因为它应该复述和未知。
注意这个过程完全依赖于用户的电子邮件帐户的安全性。 所以,这取决于安全你的愿望实现的水平。 这是通常足以满足大多数网站/应用。
特洛伊亨特使得他的文章中一些优秀的点, 我会补偿你想知道的关于建立一个安全的密码重置功能 。 最相关的摘录:
[T]这里有两种常用的方法:
- 在服务器上生成一个新的密码,并通过电子邮件发送
- 电子邮件独特的URL,这将有利于复位处理
尽管大量的指导,相反的,第一点是真的不是我们想要的。 有这样做的问题是,它意味着持续的密码 - 一个你可以回去与和使用任何时间 - 现在已经在不安全的信道上发送和驻留在您的收件箱。
...
但是,有与它使一个帐户死的简单的恶意锁定的第一种方法多了一个大问题。 如果我知道谁拥有在网站上的帐户,然后我可以锁定他们出来时,我通过重置密码请简单的电子邮件地址; 这是拒绝服务攻击担任了一个银盘! 这就是为什么一个复位东西后成功验证请求者的这样做的权利只应该发生的。
当我们谈论复位URL,我们谈论的是唯一的复位过程的特定实例的网站地址。
...
我们想要做的是创造一个独特的令牌,该令牌可以在电子邮件中发送的复位URL然后再配回服务器旁边的用户的帐户从而确认的电子邮件帐户拥有者在记录的一部分确实是一个尝试重置密码。 例如,令牌可以是“3ce7854015cd38c862cb9e14a1ae552b”,并存储在表中的旁边执行复位,并在其中生成该令牌的时间(更详细的介绍的力矩)的用户的ID。 当电子邮件被发送出去,它包含一个URL,例如“复位/?ID = 3ce7854015cd38c862cb9e14a1ae552b”而当用户加载此,页面检查令牌的存在,因此确认用户的身份,并允许密码被改变。
...
我们希望与复位URL做的另一件事是时间限制的令牌,以便复位过程必须在一定时间内完成,说一个小时之内。
...
最后,我们要确保这是一个一次性的过程。 一旦复位过程完成后,令牌应该删除,因此复位URL不再起作用。 与前面的点,这是保证攻击者,使他们能够滥用复位URL非常有限的窗口。 另外当然令牌不再需要如果复位过程已成功完成。
他让更多的好点如何避免信息泄露,验证码,双因素认证,当然像密码哈希的基本最佳实践。 我认为要注意,我不同意特洛伊对安全问题的实用性,宁愿是很重要的做法,布鲁斯的怀疑 :
所有这些问题的一点是相同的:备份密码。 如果您忘记了密码,密码提示问题可以验证您的身份,所以你可以选择其他密码或有该网站的电子邮件您的当前密码给你。 这是从客户服务的角度一个伟大的想法 - 用户不太可能忘记了他的第一个宠物的名字比一些随机的密码 - 但可怕的安全性。 的回答机密问题是容易得多比一个好的密码猜测,信息更加公开。
我会去:
当你通过电子邮件发送的任何信息,也不会是安全的。 有太多的方式有人能得到它。 这将是孩子的一个熟练的黑客寻找窃取您的信息发挥。
从发送诸如密码,并通过电子邮件的收入信息的任何个人信息,避免因为如果这样的信息被泄露或被盗,它可以成为你和你的组织很尴尬。 想想安全的重视。 它只是需要一个事件对所有的砖块下降。
至于密码检索,请仔细阅读忘记密码的最佳实践 。
底线是,以下最佳实践应用程序应该允许用户重新设置自己的密码。 人身安全问题应该被使用。 该应用程序不应该发送电子邮件,显示密码,也没有设置任何的临时密码。
编辑:更新的链接
至于说,这取决于所需的安全级别,但是,如果你需要一个更高的水平,我已经看到了一些新的解决方案包括:
临时密码的显示一半时,用户的身份已被确认(安全问题,电子邮件地址等),那么另一半发送到电子邮件帐户。 如果电子邮件帐户受到了损害,这是不可能的同一个人,也成功地进行人在这方面的中间人攻击。 (见于英国电子政务网关)
确认通过电子邮件和其他媒体的身份 - 例如通过短信发送给注册的移动代码。 (看在eBay /贝宝)
在这两者之间介于这两个极端中实现安全性问题,可能会去通过DaveG提到的方式。
如果包括与注册的电子邮件地址。 在“忘记密码”按钮,将电子邮件发送到该电子邮件地址。 它确保信息发送到信任的邮件。
(除非该数据库被黑客攻击,但后来没有什么是安全的)。
这里有三个提供密码重置信息非常好的链接:
http://jtauber.com/blog/2006/03/20/account_management_patterns/
(不要让用户确认自己是否使用GET): http://www.artima.com/forums/flat.jsp?forum=106&thread=152805&start=15&msRange=15
http://fishbowl.pastiche.org/archives/docs/PasswordRecovery.pdf
希望帮助。 他们肯定帮助我理解这个问题。
我会在整个帐户执行不同的电子邮件地址。
然后,它是发送一个链接到一个临时页面,允许人改变他们的密码一件简单的事情。 (允许24小时或更少)
用户的电子邮件帐户在此方案中最薄弱的环节。
千万不要通过电子邮件发送密码给用户。 即使是自动生成的。 最好的办法(建议和SANS及其他使用):
如果他不点击24小时或使中的链接,关闭该链路(所以它不会更改密码了)。
千万不要未经用户同意更改密码。 这意味着不发送电子邮件只是因为有人点击忘记密码链接,并想出了帐户名称的新密码。