当“忘记密码”功能可用时如何保证密码安全

Posted

技术标签:

【中文标题】当“忘记密码”功能可用时如何保证密码安全【英文标题】:How to keep passwords safe when a "Forgot Password" function is available 【发布时间】:2011-05-18 18:15:53 【问题描述】:

我和一位同事正在讨论如何在我们公司的专有网络应用程序上实现“丢失密码”功能。

我们已经决定创建一个帐户需要三个必要的元素

1) 屏幕名称 2) 电子邮件地址(用于登录) 1) 密码(显然,也用于登录。存储为单向哈希

一旦我们获得该信息,尝试注册的用户将收到一封包含链接和激活密钥的验证电子邮件。要激活他们的帐户,他们需要点击链接,输入激活密钥,然后重新输入他们的电子邮件和密码。如果一切都匹配然后presto!一个新的用户帐户被激活。

激活帐户后,假设用户忘记了密码。对于如何处理这种情况,我们有两个想法。

想法 1

    用户点击“忘记密码” 系统会提示用户输入其帐户的电子邮件地址 如果电子邮件与活动的、未关闭的帐户匹配,则将临时密码发送到已验证的电子邮件地址 用户尝试使用临时密码登录 如果临时密码与电子邮件地址匹配,提示用户重置密码。在替换临时密码之前阻止完全登录。

想法 2

这需要在注册期间收集秘密问题和秘密答案数据。

    用户点击“忘记密码” 提示用户输入电子邮件地址并回答秘密问题 验证两者后,允许用户重置密码

担忧

我们担心的一个问题是(在我们公司内部)多名员工会使用一个登录帐户。我们中的一些人认为这消除了作为一种选择的秘密问题方法。

但是,由于电子邮件不安全,通过电子邮件发送的密码(无论是否为临时)都容易受到攻击。

问题总结

考虑到内部操作限制(多人一次登录),这些想法中哪一个是最安全和用户友好的选择?或者,两者都不够?


编辑

堆栈溢出能否通过评估答案来帮助我?下面表达的意见很少,但 SO 没有任何迹象表明答案的质量。

【问题讨论】:

如果多人共享一个帐户,如果他们碰巧忘记了密码,他们只需询问帐户中的其他人。您可以手动处理该帐户中的每个人都忘记的情况。 是的。不过,这主要是内部发生的。 IE:0-15 个人可以知道登录到 SuperAdmin 帐户的任何地方。忘记密码功能不仅会被公共用户使用,如果有人在度假、被解雇、退出等,也会在内部使用。 为什么需要自动化呢?当然,您对数据库具有 root 访问权限,并且可以手动执行必要的操作。 它需要自动化,这样设计人员就可以访问帐户,而无需开发人员访问数据库。此外,它需要自动化,以便我们能够提供及时的支持(即:如果我们接到一个电话,要求我们在三年前建立的网站而该开发人员已不再与我们在一起。) 为什么要拥有超级管理员帐户而不是拥有管理员角色以便每个用户都有自己的帐户? 【参考方案1】:

在我的系统中,当有人要求丢失密码时,我:

    我生成一个 GUID 并将其与请求的日期/时间一起存储在数据库中。 向用户发送一个带有 GUID 编码的链接,以便当他们单击该链接时,它会将他们与该 GUID 联系起来 确保 GUID/链接尚未被“使用”。 确保请求不超过 30 分钟(出于安全考虑,他们只有一小段时间可以使用激活链接 - 他们从请求密码屏幕上的消息中知道这一点)

如果所有这些条件都成立,我会让他们创建一个新密码。

一般来说,虽然电子邮件不是很安全,但如果某人的电子邮件帐户被盗,你已经有一个巨大的安全漏洞,但是告诉他们只有 30 分钟的时间重新激活他们的帐户,它会减少窗口当有人可能滥用信息时:它只能使用一次,它会发送到一个已知良好的电子邮件地址,并且只能使用 30 分钟......对于我所做的系统类型,这足够安全而不会造成负担用户(或管理员)太多了。

【讨论】:

如果用户电子邮件服务器使用灰名单,30 分钟可能太短了。【参考方案2】:

我使用了发送到电子邮件的临时密码,虽然它不是最安全的。您还可以为临时密码添加时间限制,这会稍微提高安全性。我认为多个安全问题,然后将临时密码发送到电子邮件将是相当安全的。

【讨论】:

结合这些技术会提供更高的安全性,但是,您是否认为可用性成本会太大?我投票赞成少跳而不是多跳。 我同意这一点。这仅取决于您需要有多安全。我认为由于多个用户具有相同的密码,因此安全性并不高,将其发送到电子邮件就可以了……只要确保被解雇/退出的人不会通过电子邮件将新密码发送给他们。 【参考方案3】:

作为用户,我不喜欢安全问题,因为为了使它们真正安全,我必须让答案很难记住。

这是我将使用的模式:

    忘记密码链接将用户发送到其中嵌入了 UID 的 URL 忘记密码页面会发送一封电子邮件,其中包含要在该页面上输入的代码 该代码仅在从具有正确 UID 的 URL 发布时才有效。 如果从有效 URL 发布有效代码,用户将被发送到重置密码链接。

要记住的重要一点是,UID 和代码之间的映射不应该是可预测的。

【讨论】:

【参考方案4】:

公司内网访问和登录过程的规则可能与从公共互联网访问的网站或帐户的规则不同。您可以拥有电子邮件地址以及用户员工/员工编号和安全通行证或卡序列号的一部分,或者使用 IT 支持部门向每个新用户颁发的唯一且机密的登录 ID。

【讨论】:

以上是关于当“忘记密码”功能可用时如何保证密码安全的主要内容,如果未能解决你的问题,请参考以下文章

[阮一峰]找回密码的功能设计

JavaMail学习笔记帐号激活与忘记密码 实例(zhuan)

安全系列之一:忘记密码

如何使用 Firebase 实现忘记密码功能?

我有 md5 加密密码,当他使用“忘记密码”时如何给用户密码?

如何使用 JWT 令牌使忘记密码更安全?