现代 Web 应用程序中密码检索的有效技术

Posted

技术标签:

【中文标题】现代 Web 应用程序中密码检索的有效技术【英文标题】:Effective Techniques for Password Retrieval in Modern Web Applications 【发布时间】:2010-10-28 23:49:33 【问题描述】:

我们一直在开发 Web 应用程序,我们需要在其中实现密码检索的传统 Web 应用程序功能。根据趋势,有类似的方法..

    将密码重置链接发送到用户的电子邮件。 向用户询问密码恢复问题。 重置现有密码并创建新密码并将其发送给用户。这也可能会强制用户在下次登录时更改密码。

我们是否有任何非传统技术来实现密码检索机制?您为此尝试了哪些其他方法?

谢谢。

【问题讨论】:

“非传统”我认为你的意思是“更糟?”传统的存在是有原因的。 我强烈反对 mquander 的观点,但我也不知道有什么比列出的传统方法更好的方法,都相当强大 发送新密码(选项 3)等同于发送休息链接(选项 1),因为用户可能会更改密码。 @mquander:一切都与用户体验有关。问这个问题的动机是为了给我的用户以某种方式或其他方式的新鲜体验。希望这能解释提出这个问题的想法。 @s_ruchit:这取决于,人们可能会保留自动生成的密码而不是他们的标准“密码1”(这是一个加号) 【参考方案1】:

密码重置链接的另一种方法可能是创建一个随机密钥,该密钥不会在电子邮件链接中出现,用户在单击链接后必须输入该密钥。这将有助于防止人们捕获电子邮件。

【讨论】:

【参考方案2】:

我在实践中看到的其他选项包括:

在出现问题时允许使用第二个密码 - 例如手机使用的超级 PIN。 创建一个文件令牌(通常是 PGP 密钥),用户将在创建帐户时下载该令牌并将其存储在 USB 记忆棒上,或将其存档以备后用。当出现问题时,用户将上传令牌,从而证明他是帐户的“所有者”,并且应用程序将让用户更改密码。这可以是一个常量令牌,也可以是一个包含多个令牌的文件(类似于网上银行 TAN)——每次使用一个令牌时,它也会失效。

上述方法实现起来并不简单,但对用户非常友好(因为它们没有什么新意,而且在其他日常情况下也会出现)。

【讨论】:

【参考方案3】:

这取决于您的目标安全级别、支持成本和可用性问题。

出于多种原因,通过电子邮件发送密码重置链接是首选方法:

支持成本 - 从业务角度来看,这是最大的因素。用户甚至经常忘记他们的密码提示或使用虚假的邮寄地址或忘记他们的用户名。所有这些都是您可能会收到支持请求的合法问题。这反过来又产生了另一个问题,您必须通过询问他们最近的帐户活动以及什么不是来确定用户的合法性。如果您不提供这种级别的支持,很多新手用户会感到失望。通过电子邮件发送密码重置链接可以缓解这些担忧,因为用户通常有一个或两个电子邮件地址,并且他们可以通过提供他们的电子邮件地址轻松恢复他们的用户名/密码。

安全问题 - 从技术角度来看,这是最大的因素。这里有各种各样的问题,你必须权衡。被入侵的电子邮件帐户意味着黑客可以访问所有允许通过电子邮件发送密码重置链接的用户服务。您可以采取中间立场,即通过电子邮件将密码重置链接发送给用户,然后向用户询问密码提示问题,然后允许他们重置密码。同样,您不应该在任何媒体中公开用户的密码。事实上,如果您有能力向他们显示他们的密码,那么您的系统就已经不安全了,因为这意味着您没有使用 SHA-1 之类的安全哈希来存储它们,并且您公司的开发人员可以获取每个人的密码。

可用性 - 从用户的角度来看,这是最大的因素。通过电子邮件发送密码重置链接需要用户去检查他们的电子邮件地址,这意味着完成任务的时间可能长达 2 分钟甚至 3 分钟。但是,我认为这没什么大不了的。大多数用户似乎并不介意这一点,因为他们觉得自己有过错,这是符合他们最大利益的安全措施。我只是根据个人经验进行假设,一般用户可能会有不同的感受。我会将安全性视为比用户体验更高的优先级,因为用户很少需要检索他们的密码(用户很长时间没有登录并忘记了他的密码;用户已将他的密码保存在重新安装的浏览器中,并且其他一些极端情况)。

【讨论】:

从可用性的角度来看,我们可以设想哪些技术?这实际上是标准。对我们来说,没有什么比用户体验更重要了。 在某些情况下,安全和隐私比用户体验更重要。 @s_ruchit,如果用户体验是一个大问题,那么您不妨同时提供这两个选项,使用 hotmail.com 之类的密码提示系统,并提供通过电子邮件发送密码重置表单的链接给他们。这种方式他们可以选择,但从安全的角度来看,它开辟了新的攻击媒介。 @s_ruchit,更新了最后,以反映为什么安全应该比用户体验更重要。 想想如果密码被泄露,用户体验会怎样。【参考方案4】:

网站及其管理员不应知道其用户的明文密码。应该只存储密码的单向哈希,以便在身份验证事件中进行比较。所以发送密码明文不应该是一种选择。

我个人喜欢发送给用户的密码重置链接。请记住使该链接过期。此外,通过电子邮件通知用户密码重置尝试(可以是与重置链接相同的电子邮件),以及成功重置后。

【讨论】:

【参考方案5】:

在我看来,向用户的电子邮件发送密码重置链接是最好的方法。 Digg 就是这样做的,我也是这样做的。

但在这种方法中,我们需要依赖用户能够访问他的电子邮件。

关于密问方法:密问的答案往往不如我们想的那么密。阻止这种“帐户破解”方法符合我们用户的最大利益。

【讨论】:

以上是关于现代 Web 应用程序中密码检索的有效技术的主要内容,如果未能解决你的问题,请参考以下文章

现代信息检索——基本概念

怎么攻击私服的SQL

一种混合式聚焦爬虫框架:有效检索Surface Web和Dark Web中的特定内容

忘记密码功能 Spring(密码检索)

如何从 ASP.NET Core 中的密码重置令牌中检索用户?

现代密码学-密钥管理技术