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

时间:2009-05-23 14:42:22

标签: security md5 application-design forgot-password

  

可能重复:
  Forgot Password: what is the best method of implementing a forgot password function?

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

我想建立一个“忘记密码”功能。

环顾不同的网站,我发现他们使用三个选项之一:

  1. 向用户发送电子邮件,其中包含指向唯一隐藏网址的链接,以便他更改密码(Gmail和亚马逊)

  2. 向用户发送一封电子邮件,其中包含新的,随机生成的密码(Wordpress)

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

  4. 选项#3 对用户来说似乎最方便,但由于我将密码保存为MD5哈希,我不知道选项#3是如何可用的,因为 MD5是不可逆即可。这似乎也是不安全选项,因为这意味着网站必须在某处以明文形式保存密码,并且至少通过不安全的电子邮件将明文密码发送给用户。或者我在这里遗漏了什么?

    因此,如果我不能选择#1,选项#2 似乎是最简单的编程,因为我只需要更改用户的密码并发送它给他。虽然这有点不安全,因为您必须通过不安全的电子邮件传递实时密码。然而,麻烦制造者也可能通过输入随机电子邮件和不断更改各种用户的密码来滥用纠缠用户

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

    您使用/编程这些不同选项有哪些经验?有没有我错过的选项?

17 个答案:

答案 0 :(得分:34)

4)将两个随机金额存入银行账户并要求他们输入 5)Snail向他们发送一些新密码并要求他们输入。
6)让他们发短信或拨打某个号码,并使用他们在档案中注册的手机为电话号码输入一些值 7)通过外包给Stack Overflow,Facebook,博客引擎等OpenID提供商,完全摆脱密码管理问题。

除此之外,使用选项#1或#2,添加的功能都会在一小时后到期。

答案 1 :(得分:9)

我对那些描述#1和#2等同的答案感到震惊。它们根本不存在。向用户发送短期链接以更改其密码是最方便,最常用且最安全的方法,不涉及带外交互(邮件,文本消息等)。原因如下:

  1. 通过忘记密码链接设置临时密码,用户可以有效地更改用户密码,并在用户知道用户登录时锁定用户的帐户。通过链接,用户只需知道某人正在搞乱,他们的访问权限就不会受到影响。
  2. 密码重置链接仅在短时间内有效,因此攻击者可以使用非常小的窗口进行攻击。即使他们这样做,用户也会知道,因为如果攻击者拦截了链接并使用它来更改密码,则重置链接将不再有效。如果用户未立即更改新分配的密码,截获密码的攻击者可以无限期地悄悄冒充用户。所以最大的区别是,虽然黑客可以拦截重置密码链接电子邮件,但如果他们使用该链接更改用户密码,则用户会知道出现错误,因为该链接无法正常工作他们将生成另一个密码重置请求。
  3. 易于使用 - 用户只需点击其电子邮件中的链接,而不是输入您生成的新随机密码。
  4. 安全问题通常会使网站不那么安全,而不是更多 - 它们是另一种攻击媒介,通常是最薄弱的环节。我强烈建议您阅读The Web Application Hacker's Handbook,以便就此主题进行精彩讨论。

答案 2 :(得分:8)

请注意,选项#2还要求您跟踪旧密码,如果未在24小时内使用,则使新随机密码失效。

否则我可以通过反复向您发送一个新的随机密码来惹恼您 - 如果您不在您的电子邮件附近,您可能不知道为什么您无法使用正常密码登录。

此外,请避免要求“身份识别问题”。这些问题的答案通常比真实密码更容易猜测/查找 - 因此每个人都可以将自己标识为我。有关这种不安全的最新示例,请参阅Sarah Palin故事。

答案 3 :(得分:6)

选项1和2彼此不安全。

有。我说了。如果用户的电子邮件帐户遭到破坏,除非您收集更多私人数据,例如他们的地址,母亲的婚前姓名 - 所有这些都可以被猜到,所以没有合理的安全方式来做事情。

我见过的最好的(尽管最烦人的)版本是你需要记住秘密问题秘密答案的地方。这意味着用户必须记住他们提出的问题,当然,这也可能永远被遗忘!

如果他们忘记了这个问题并且您是一个“真正的”公司,那么总是可以选择通过帖子向用户发送令牌,并提供如何重置所有安全性的说明......黑客不太可能将有权访问他们的真实邮件。

这种情况的偏差是在用户创建帐户时收集电话号码。如果存在并且他们无法记住他们的任何细节,您可以设置某种自动呼叫系统,告诉他们如何重置他们的详细信息。

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

答案 4 :(得分:4)

阅读OWASP top ten以确保您的方法合规。

Here是直接链接。

答案 5 :(得分:4)

快速说明一些与您的问题无关的内容。您提到您使用MD5来哈希存储的密码。无论您选择使用选项1还是2(由于显而易见的原因,3都是最不安全的),MD5是一种破解哈希算法,实际上可以让黑客很容易获得受保护的帐户的访问权限。 MD5哈希。

您可以通过以下网址详细了解该漏洞:en.wikipedia.org/wiki/MD5

更好的散列解决方案就像SHA一样,它仍然是一种稳定而安全的散列算法。结合选项#1或#2,您应该拥有一个合理安全的系统来保护您的用户密码,除了最坚定的黑客之外的其他所有人。

答案 6 :(得分:4)

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

事实上,随着网络钓鱼攻击的普遍存在,人们可能会争辩说鼓励使用带有长URL的选项1可能会让人们对点击长长的神秘网址不那么警觉。

答案 7 :(得分:2)

选项#1可能是最好的。 #3是不安全的(我还建议使用比MD5更强的东西,比如SHA1)。选项#2不好,因为除非您使用安全问题,否则在您检查电子邮件之前,它允许任何随机人员将您锁定在您的帐户之外。安全问题通常比密码更容易破解。

答案 8 :(得分:2)

选项#1比#2有几个主要优势。如果随机用户在“我忘记了密码”框中输入了我的电子邮件地址,则我的密码将不会被重置。此外,它更安全一点,因为永远不会永久记录存储在您的Gmail邮箱中的网站密码。

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

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

我首选的方法是尽可能使用openid。密码管理是没有人似乎完全正确的地狱。将此问题交给其他人更容易。

答案 9 :(得分:1)

选项4:要求用户输入其帐户名和电子邮件地址重置密码。只要您没有在网站上披露真实姓名或电子邮件地址(您为什么在这个时代?),这是一种相当安全且防篡改的方法。发送重置页面的链接,而不是密码本身。

选项5:使用OpenID并将责任转交给第三方担心。

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

答案 10 :(得分:1)

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

对于编程#1或#2,选项#2更容易编程,但#1并不难,并且两者都可能彼此安全。

无论您选择哪个选项,您都可以考虑通过在忘记密码过程中包含个人信息请求(您在注册期间获得)来使其更安全。

我已经为您拥有用户名的系统编程,要获得新密码,您必须输入用户名和电子邮件地址。您可以收到有关用户名的提醒,但重点是有人可能无法猜到您的用户名和电子邮件,但如果您只是通过电子邮件进行,则安全性会降低。

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

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

最简单的方法是:

  1. “提醒我用户名”链接(输入电子邮件)。不要告诉用户是否发送了电子邮件,因为人们可以使用它来查明电子邮件地址是否属于成员。始终告诉用户在收件箱中查看提醒邮件,但只有在有人成为会员时才发送;和
  2. 同时要求用户名和电子邮件发送新的一次性密码。该密码应该只持续一个小时左右。当用户使用它时,应立即强制他们更改密码。

答案 11 :(得分:0)

如果你正在散列它们,则选项3不可用,如果你没有散列它们,那么你会感到羞耻。 :)

我更喜欢选项1,发送重置密码链接发送到他们的电子邮件,允许他们(在有限的时间内)重置他们的密码。它确实需要更多的工作,但它们很容易使用,并且最终像他们的电子邮件登录过程一样安全。

答案 12 :(得分:0)

你可以在#1和#2之间进行混合,从两者中获益:

向用户发送一封电子邮件,其中包含指向唯一隐藏网址的链接,该网址允许他更改新随机生成的密码。

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

答案 13 :(得分:0)

还有一个附加选项可以与您提到的任何选项结合使用:

您可以让用户为他们的密码写一个提醒,这是他们忘记密码时发送给他们的第一步。如果提醒对用户没有帮助,您可以继续下一个选项。

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

答案 14 :(得分:0)

选项1或2都可以。正如您所说,选项3是不安全的,因为您需要存储明文密码。您可能会想到并使用可逆加密算法来存储/检索密码,但是有更好的替代方案可供您使用,没有理由走这条路。

答案 15 :(得分:0)

我尝试了几种我并不满意的方法。我为下一个项目所做的就是:

  1. 用户输入用户名和电子邮件地址
  2. 使用包含url和guid param的链接发送的电子邮件已存储在数据库中且48小时到期
  3. 用户确认要重置的密码
  4. 新密码通过电子邮件发送给用户
  5. 使用新密码登录显示消息或重定向以更改密码页面。

答案 16 :(得分:0)

指示用户亲自到您的办公室,并用身份证或护照证明自己的身份。

当然,这假设您的用户附近有办公室,而且该帐户的价值足以证明此程序的合理性。适用于银行。