什么是最好的“忘记我的密码”的方法?

可能重复:
忘记密码:实现忘记密码function的最佳方法是什么?

我正在编程一个社区网站。

我想build立一个“忘记我的密码”function。

环顾不同的网站,我发现他们采用三种select之一

  1. 向用户发送一封电子邮件,指向一个唯一的,隐藏的URL ,允许他更改密码(Gmail和亚马逊)

  2. 向用户发送一封新的随机生成的密码 (Wordpress)

  3. 发送用户当前的密码 (www.teach12.com)

选项#3对用户来说似乎是最方便的,但是由于我将密码保存为MD5哈希值,因此MD5是不可逆的 ,所以我没有看到选项#3是否可用。 这似乎也是不安全的select,因为这意味着网站必须以明文保存密码,至less明文密码通过不安全的电子邮件发送给用户。 还是我在这里错过了什么?

所以如果我不能做选项#1, 选项#2似乎是最简单的编程,因为我只需要更改用户的密码,并将其发送给他。 尽pipe这样做有些不安全,因为您必须通过不安全的电子邮件传输活动密码。 然而,这也可能被麻烦制造者滥用,通过随机input电子邮件和不断更改各种用户的密码来纠缠用户。

选项#1似乎是最安全的,但需要一些额外的编程来处理隐藏的URL过期等,但似乎是大网站使用。

你有什么经验使用/编程这些不同的选项? 有没有我错过的select?

4)用两个随机数记入他们的银行账户,并要求他们input。
5)蜗牛邮寄给他们一些新的密码,并要求他们input。
6)给他们发短信或打个电话号码,并用手机login电话号码input一些电话号码。
7)把密码pipe理问题彻底解决,把它们外包给像Stack Overflow,Facebook,博客引擎等OpenID提供商正在开始做。

在这些之外,使用选项#1或#2,添加的function都将在一个小时内过期。

请注意,选项2还要求您跟踪旧密码,并在24小时内未使用新密码的情况下过期。

否则,我可以通过反复发给你一个新的随机密码来烦扰你 – 如果你不在你的电子邮件附近,你可能不知道你为什么不能用你的正常密码login。

另外,请避免要求“识别问题”。 这些问题的答案通常比真正的密码更容易猜测/查找 – 所以每个人都可以将自己标识为我。 最近看到萨拉·佩林(Sarah Palin)的故事是最近的一个例子。

对于将#1和#2描述为等同的答案,我感到震惊。 他们根本没有。 发送用户短期链接来更改密码是最方便,最常用,最安全的方法,不涉及带外交互(邮件,文本消息等)。 几个原因:

  1. 通过忘记密码链接设置临时密码,用户可以有效地更改用户的密码,并在知道用户login名的情况下locking用户。 通过链接,用户只需知道有人正在搞乱,他们的访问不受影响。
  2. 密码重置链接仅在短时间内有效,因此攻击者有一个非常小的窗口进行罢工。 即使他们这样做,用户也会知道,因为如果攻击者拦截了链接并使用它来更改密码,重置链接将不再起作用。 如果用户没有立即更改新分配的密码, 那么截获该密码的攻击者可以无限制地悄悄模仿用户 。 所以最大的区别就是,虽然黑客可以拦截重置密码的链接电子邮件,但如果他们使用链接来更改用户的密码,用户会知道有什么地方是错误的,因为链接不工作,他们会产生另一个密码重置请求。
  3. 更易于使用 – 用户只需点击电子邮件中的链接,而不是input您生成的新密码。

安全问题通常会使网站的安全性降低,而不是更多 – 它们是另一种攻击媒介,往往是最薄弱的环节。 我强烈推荐阅读“Web应用程序黑客手册” ,以获得有关此主题的精彩讨论。

选项1和2彼此不安全。

那里。 我说了。 如果用户的电子邮件帐户被破坏,那么除非您收集更多私人数据,比如他们的地址,母亲的婚前姓名 – 所有这一切都可以猜到,否则没有合理的办法可以做。

我所见过的最好的(尽pipe最烦人的)版本是你需要记住一个秘密的问题一个秘密的答案。 这意味着用户必须记住他们问了哪个问题,当然哪个问题总是可以被忘记!

如果他们忘记了这个问题,而且你是一个“真正的”公司,那么总是可以select通过邮件向用户发送令牌,以及如何重置所有安全的说明。黑客不太可能访问到他们现实生活中的邮件。

一个歪斜就是在用户创build账户时收集一个电话号码。 如果存在,他们不记得任何细节,你可以设置某种自动呼叫系统,告诉他们如何重置他们的细节。

还有一点要提到#2:不要让这个过程覆盖当前帐户的密码。 如果发生这种情况,任何人都可以说他们忘记了任何帐户的密码,引发了大量不必要的密码更改。

选项1或2的安全性没有实质性区别。选项1与在表单中预加载新密码的效果相同。

事实上,随着networking钓鱼攻击的泛滥,人们可能会争辩说,鼓励使用长URL的选项1可能会使人们对点击长长的神秘url的警觉性降低。

阅读OWASP前十名 ,确保您的方法符合要求。

这是直接的联系。

只是一个简短的说明,而不是专门针对你的问题。 你提到你使用MD5来散列存储的密码。 无论您select使用选项1还是选项2(3由于显而易见的原因将是最不安全的),MD5是一种破解散列algorithm,实际上可以使黑客更容易访问由MD5哈希。

您可以通过以下url阅读关于此漏洞的更多信息:en.wikipedia.org/wiki/MD5

一个更好的散列解决scheme就像SHA,它仍然是一个稳定和安全的散列algorithm。 结合选项#1或#2,你应该有一个合理的安全系统,以保护你的用户密码,除了最坚定的黑客之外的所有。

选项#1可能是最好的。 #3是不安全的(我也build议使用比MD5更强的东西,比如SHA1)。 选项2是不好的,因为它允许任何随机的人locking你的帐户,直到你检查你的电子邮件,除非你使用一个安全问题。 安全问题通常比密码更容易破解。

选项#1在#2方面有几个主要优势。 如果随机用户在我的电子邮件地址中键入“我忘记了我的密码”框,那么我的密码将不会被重置。 而且,它的安全性稍高一些,因为永远不会永久logging存储在Gmail收件箱中的网站密码。

这里的一个重要缺失部分是您在#1中提供的链接只能用于一次密码重置并且有时间限制

所有这些解决scheme意味着您将您的电子邮件收件箱视为统一所有内容的“一环”。 无论如何,现在大多数在线服务似乎都在这样做。

我喜欢的方法是在可能的情况下使用openid。 密码pipe理是地狱,没有人看起来很正确。 把这个问题交给别人比较容易。

选项4:要求用户通过input帐户名称和电子邮件地址重置密码。 只要您不透露网站上的真实姓名或电子邮件地址(为什么您会在今天这个年龄?),这是一个相当安全和防篡改的方法。 发送链接到重置页面,而不是密码本身。

选项5:使用OpenID并将责任传递给第三方来担心。

老实说,这比大多数网站所要求的要多得多。 我喜欢通过电子邮件接收明文密码,因为我将它们存储在收件箱中的“注册”文件夹中。 这样我可以查找密码的网站,当我忘记他们(发生了很多!)。 如果有人正在阅读我的电子邮件,我有更多的问题担心比使用我的Twitter帐户的人(如果我有一个)。 当然,银行和公司有更强的要求,但是你没有具体说明你的网站是什么。 这是最好的答案的关键。

我同意你对选项#3的评论是不安全的。

至于编程#1或#2,选项#2更容易编程,但#1没有太多困难,两者可能大致相同的安全。

无论您select哪个选项,您还可以考虑通过在注册过程中包含个人信息请求(作为忘记密码处理的一部分)来提高安全性。

我已经编制了系统,你有一个用户名,并得到一个新的密码,你必须input你的用户名和你的电子邮件地址。 您可以发送一个提醒您的用户名,但重点是有人可能无法猜测您的用户名和您的电子邮件,但如果你只是通过电子邮件来做,那就不太安全。

秘密问题是个人信息部分的一种方法。 我个人认为他们不提供很多价值,因为人们倾向于select许多人会知道答案,能够猜测或能够发现的问题。 只要你把它和一个已经比较安全的方法结合使用,总比没有好。

显然,你做的越多,编程工作就越多。

最简单的方法是:

  1. 有一个“提醒我的用户名”链接(input电子邮件)。 不要告诉用户电子邮件是否被发送,因为人们可以使用它来找出电子邮件地址是否是成员。 总是告诉用户检查他们的收件箱中的提醒邮件,但只有当某人是会员时才发送邮件。 和
  2. 要求用户名和电子邮件发送一个新的一次性密码。 该密码只能持续一个小时左右。 当用户使用它时,他们应该被迫立即改变他们的密码。

选项1或2都可以。 正如你所说,选项3是不安全的,因为你需要存储明文密码。 你可能会喜欢,并使用可逆的encryptionalgorithm来存储/检索密码,但有更好的select可用于你没有理由顺其自然。

有一个额外的选项,你可以结合你提到的任何选项使用:

你可以让用户写一个密码提醒,当你忘记密码的时候,把它作为第一步发送给他们。 如果提醒不能帮助用户,则可以继续下一个选项。

由于提醒不是密码本身,所以通过邮件发送(或者甚至直接在页面上显示)是安全的。

如果你哈希他们选项3是不可用的,如果你没有哈希他们,羞耻你。 🙂

我更喜欢选项1,发送重置密码链接发送到他们的电子邮件,允许他们(在有限的时间)重置他们的密码。 这确实需要更多的工作,但是他们使用电子邮件login过程最终也很安全。

你可以在#1和#2之间混合使用,

向用户发送一封电子邮件,指向一个唯一的,隐藏的URL,允许他更改一个新的随机生成的密码。

该页面可能是SSL,并且密码可能会在12-24小时内过期。

我尝试了一些我并不满意的方法。 我为下一个项目所定下的是:

  1. 用户input用户名和电子邮件地址
  2. 电子邮件发送链接包含url和GUID参数已被存储在数据库48小时过期
  3. 用户确认要重置的密码
  4. 新密码通过电子邮件发送给用户
  5. 用新密码login显示消息或redirect更改密码页面。

指导用户亲自到你的办公室,用身份证或护照certificate自己的身份。

当然,这是假定你在你的用户附近有办公室,而且这个帐户是有价值的,足以certificate这个过程是正确的。 适用于银行。