实际上,我一直在围绕这个领域研究一些想法,所以到目前为止,这里是我的一些想法。我提前为这个答案的荒谬长度道歉。
密码重置机制的设计必须牢记三个主要目标:
对于一个好的机制,我们需要在三者之间取得平衡。
在开始之前我想做出一些断言:
对,进入实际答案!
1. 多因素认证
多因素身份验证(MFA) 是最安全的帐户恢复方法之一,通常是人工身份验证。对于那些不熟悉 MFA 的人,它的工作原理是您必须拥有多个凭证才能进行身份验证:
- 你知道的东西(例如密码、秘密答案)
- 您拥有的东西(例如密钥、硬件令牌等)
- 你是什么(例如指纹)
需要注意的是具有一种类型的多个,例如两个密码,或者密码和脚,并不能算作MFA。我在看着你,网上银行网站。
1.1。你知道的东西
重置密码时,验证用户身份的常用方法是问他们一些问题。不幸的是,这些问题通常是诸如“你上哪所学校?”之类的问题。和“你母亲的娘家姓是什么?”,攻击者很容易通过社交网络找到这些信息。此外,许多用户在注册时不喜欢回答这些问题,所以他们只是敲了一堆键,使问题的目的无效。
对于电子商务网络应用程序和其他存储私人个人信息(例如地址/电话号码)的网络应用程序,人们可能会要求提供该信息。但是,请记住,这些信息也可能在网上找到。
另一种方法是根据用户在网站上的体验提出上下文问题。例如,Hotmail 会要求您提供最近与之通信的电子邮件地址,以及有关您帐户活动的其他一些信息。这适用于大多数类型的 webapp,但并不总是适用。
1.2. 你有的东西
通常,网站会将链接或一次性密码通过电子邮件发送到您的电子邮件地址作为 MFA 的一种形式。我断言这是一个错误的假设。用户在帐户之间共享密码。这是一个绝对的事实,你无法阻止它。因此,您必须假设攻击者已经可以访问用户的电子邮件地址。稍后我们将介绍它的含义。
手机的普及使它们成为一种很好的双因素身份验证机制,作为带外检查的一种形式。SMS 重置令牌易于用户理解和使用,攻击者不太可能访问手机。然而,这种方法并非没有缺陷。最大的问题是当用户丢失手机或更换提供商时。这完全使手机无法作为可用的重置设备。另一个问题是用户并不总是随身携带手机。
在智能手机上使用应用程序部分解决了这个问题。如果用户更改了他们的提供商,该应用程序仍保留在手机上。允许基于 SMS 和基于应用程序的重置允许对可靠性有合理的期望。
或者,允许用户关联一个登录提供商帐户(例如 OpenID)并使用该帐户的有效登录作为“您知道的事情”证明。
其他潜在机制:
- 物理令牌(例如RSA SecurID、USB 令牌)——对于大多数地方来说并不完全可行,但对银行、内部公司系统和其他高安全性情况很有用。
- 文件 - 在注册时提供给用户的随机生成的文件。哈希存储在数据库中。重置后,用户要求提供文件。不是最好的可用性或安全性,但可能有用。
1.3. 你是什么
这就是事情变得有趣和科幻的地方。生物特征认证是最近变得越来越流行的东西。相当多的笔记本电脑包括指纹扫描仪,您可以以相对较低的成本购买便宜的 USB 笔记本电脑。另一种流行的生物识别机制是通过网络摄像头进行的面部识别。如果做得好,这两者在安全性方面都非常出色,但它们都有一些问题:
- 大多数实现都是概率性的,因此是不安全的。是什么阻止了攻击者将您的脸部照片举到相机前?
- 您不能依赖每个用户都拥有指纹扫描仪,而那些拥有指纹扫描仪的用户并不都相互兼容。此外,您正在与硬件交互,因此需要本机应用程序与您的网络应用程序对话。
- 生物识别领域相对较新,因此没有任何经过充分研究且具有完全理解的安全模型的成熟实施。
总而言之,“你是什么”模型适用于个人身份识别,但对于 web 应用程序来说实际上并不可行,除非你为客户提供指纹扫描仪和适当的软件。
1.4. MFA 最佳实践
单因素身份验证是不够的。正如我们从最近的所有 违规行为中看到的那样,很难保证密码的安全,即使它们经过哈希处理,它们仍然可以被破解。MFA 对于登录和密码恢复都是必需的。只要移动设备仍然可用,用于恢复目的的移动身份验证就可以解决大多数问题。在无法进行移动身份验证的情况下,您必须有一个手动验证过程,他们必须让人们相信他们是真正的交易。
2. 重置机制
那里有许多不同的密码重置方法,其中许多在安全性方面落后了。我将讨论一些我在野外看到的,解释它们的优点和缺点,并提出一些更好的建议。
2.1。通过电子邮件将密码发回
最基本的机制是将用户的密码通过电子邮件发送给他们。请永远不要这样做。可怕到无法估量。首先,它要求您以明文或至少以可逆格式存储密码。您必须 正确地散列密码,并遵循加盐的最佳做法。其次,您通过明文协议通过 Internet 以明文形式通过电子邮件发送用户密码。为这样做的人保留了一个特殊的地狱级别。
2.2. 生成新密码
一些网站会生成一个新的随机密码,对其进行哈希处理,然后通过电子邮件将其发送给用户。由于很多原因,这不是一个好主意,尽管其中大多数都可以通过某种方式得到缓解。最根本的问题是您正在通过电子邮件将可用密码以明文形式发送给用户。此方法的其他问题包括:
- 许多用户很懒惰,不少用户会重置并告诉浏览器记住随机密码。
- 许多网站不会强制您在首次使用密码时更改密码。
- 有权访问电子邮件帐户的攻击者可以访问密码,无论您首先使用什么机制来验证用户身份。
2.3. 重置链接
这是更好的(谢天谢地,更受欢迎的)机制之一。它涉及对用户进行身份验证,然后通过电子邮件向他们发送一次性重置链接。使用重置链接后,系统会提示用户设置新密码。完成后,链接无效。通过在链接中包含到期时间,并在设置密码或用户会话超时后强制链接无效,可以提供进一步的安全性。
这种方法的失败在于我们记得我们之前的假设。用户的电子邮件帐户不安全。它不能算作“你知道的东西”。虽然攻击者的时间窗口很短,但他们仍然可以闯入。当然,如果(或者更确切地说,当)用户忘记了他们的电子邮件密码,所有这些都会进一步失效。
2.4. 永远不要离开网站
这确实是圣杯,但只能与强大的多因素身份验证一起使用。一旦用户使用安全问题、带外检查(例如手机)、密钥文件、生物特征、人工验证等组合来验证自己的身份,他们就会立即重定向到密码更改表单。这完全绕过了使用电子邮件地址的需要。
如果您确实认为有必要使用电子邮件地址发送链接,请考虑提供无电子邮件重置选项,以增加您需要通过的检查数量。
三、结论
在最好的情况下很难平衡安全性、可用性和可靠性,但这种情况直接与已经证明自己不可靠的用户打交道。我不是在任何贬低的意义上说这句话,而是说我们都容易犯错。
重要的是要保持密码重置系统的可用性和简单性,而不要忽视安全性。在对您的 web 应用程序的各个方面实施大规模的 3 因素身份验证过程之前,请考虑您要保护的内容。如果您只是一家在网上销售商品的小公司,您可能可以通过基本的 2 因素来摆脱困境。如果您是大型零售商、银行或社交网站,您应该在恢复时使用强大的 2 因子(每种类型有多种),并在来自无法识别的来源的登录时使用 2 因子。
一句话:保持简单,想想你的听众。