2FA 为什么不在密码前询问密码

信息安全 密码 多因素 授权
2021-08-17 05:11:01

因此,在大多数网站的登录页面中,您必须输入用户名和密码,例如 Facebook,您在其中输入用户名和密码,然后提交表单。其他网站分别询问您,例如谷歌,您输入用户名并提交,然后输入密码并提交等。

如果使用第二种方案 - 用户名然后提交等。为什么不先使用 SMS 代码?

我的想法是,这将防止用户猜测或暴力破解密码,该密码通常用于电子邮件等其他服务,然后通常可用于从 SMS 授权中解锁帐户。

另一个原因是这会直接为用户提供有关登录尝试的信息。

编辑:我意识到我没有提到 2FA 不是必需的,而是可选的,类似于 facebook 或 google。

我还想假设 2FA 过程本身没有缺陷 - 用户不能设置无效号码,并且在设置时检查号码。将通过发送测试 OTP 来检查该号码,该 OTP 需要确认号码是否正确。

3个回答

TL;DR安全性很难,即使对安全协议的工作方式进行微小的更改也可能引发意外攻击。虽然乍一看似乎将 2FA 放在密码之前有助于保护密码,但它实际上会引发更严重的攻击。我们来看一下!


我们试图解决的问题

根据您的问题,您要解决的问题是密码暴力破解。这有点像红鲱鱼,因为人们破解被盗或泄露的密码哈希数据库的密码,人们不会暴力破解实时服务器,因为诸如速率限制之类的东西已经很好地解决了这个问题。也就是说,让我们看看不同类型的 2FA 以及如果 2FA 在密码之前会发生什么。

代码生成应用

又名基于时间的一次性密码算法 (TOTP),例如 Google Authenticator:

谷歌身份验证器截图

我同意你的观点,我无法想出为什么把它放在第一位会削弱身份验证协议的原因。

通知应用

一些 2FA 旨在在手机上弹出通知,而不是让您输入代码,例如 Blizzard Authenticator:

暴雪验证器截图

执行您建议的将其放在密码之前实际上是危险的,因为它会导致拒绝服务攻击:攻击者敲击用户的帐户,以便在他们的手机上出现几乎恒定的通知,或者阻止他们能够使用他们的手机,和/或强迫他们禁用 2FA 以使通知停止(并削弱他们的帐户)。

短信代码

也就是通过短信向您的手机发送一次性密码。

这与通知应用程序有相同的问题,因为它会导致明显的拒绝服务攻击,但更糟糕的是,在某些地方,电话运营商对传入的短信收费,因此攻击者可以强迫用户支付巨额手机账单。

概括

在我提到的三种 2FA 应用程序中,您的建议对一种是中性的,对另外两种是有害的。

此外,将 2FA 步骤放在首位会向攻击者宣传哪些用户启用了 2FA,哪些用户没有启用。基本上告诉他们谁是容易的目标。

最后,基于通知和 SMS 的 2FAs 服务器还有另一个有价值的用途:当您的密码被破解时发出警报通知您。如果我收到意外的 2FA 通知,是时候更改我的密码了。

我喜欢你跳出框框思考并挑战事物的方式。安全性很难,但不要因为提出更多问题而气馁,这个回答很有趣。

这样一来,犯错的用户就不会无限期地等待永远不会出现的 OTP。

想象一下如果一次性密码 (OTP) 出现在密码之前的工作流程。它看起来像这样:

  1. 用户输入用户名
  2. 系统查找用户名查找手机号

    一个。如果用户名有效且电话号码存在,则系统发送 OTP

    湾。如果两者都不存在,则系统不发送任何内容

  3. 无论哪种方式,系统都会显示“我们已向与您帐户关联的手机号码发送一次性密码”。

为什么“无论哪种方式”,你可能会问?为什么两种情况下的消息相同?请参阅OWASP 身份验证备忘单,它告诉我们:

无论用户 ID 或密码是否不正确,应用程序都应以一般错误消息进行响应。它也不应指示现有帐户的状态。

正确响应示例

-“登录失败;用户 ID 或密码无效”

不正确的响应示例

  • “用户 foo 的登录名:密码无效”

  • “登录失败,用户 ID 无效”

  • “登录失败;帐户已禁用”

通用消息的原因是为了避免提供任何黑客可用于用户 ID 耕种的信号。

现在让我们继续我们的工作流程。

  1. 如果用户输入了具有电话号码的有效用户 ID,她会收到 OTP 并可以输入。

  2. 如果用户没有输入有效的用户 ID,或者输入的用户 ID 没有与之关联的电话号码,用户将无限期等待

所以现在我们看到了问题。如果用户犯了错误,系统无法告诉她她犯了错误,她将不得不无限期地等待 OTP。这与即时反馈的密码验证不同。

如果首先检查密码,整个问题就会消失。一旦用户通过第一个因素进行身份验证,我们已经确定用户 ID 是有效的,并且可以告诉他们他们是否从未在帐户上设置电话号码。

其他用例也受到影响

这些其他用例也变得更糟糕的用户体验,或者由于安全要求而难以实施:

  1. 用户拥有不止一部手机。
  2. 用户最近换过手机。
  3. 用户记错了他的用户 ID
  4. 用户处于锁定状态
  5. 用户短信收件箱已满
  6. 运营商限制,例如超出 SMS 限制或客户在收款中
  7. 手机丢失/被盗

这是因为垃圾邮件的原因。

这样做允许攻击者迭代用户名(主要是这些用户名是公开的或很容易猜到的),因此网站会向每个人发送大量无用的文本/邮件。网站肯定会被列入“垃圾邮件发送者”的黑名单。

这不能保证,除非关闭所有登录几分钟(如果您只向一个帐户发送垃圾邮件,如评论中所述,那么如果几分钟前已经询问过一个 OTP,那么您可以拒绝发送另一个 OTP,但这不能做网站明智的)。

首先询问密码会阻止这种攻击,因为您也必须知道每个人的密码。