为什么使用一次性代码进行双重身份验证备份?

信息安全 验证 密码管理 密码策略 多因素 一次性密码
2021-09-08 11:12:27

我正在构建一个使用双因素身份验证的 Web 应用程序。

在实现恢复功能时,我看到大多数公司(例如 Apple、Facebook、Github)都提供了一组约 15 个备份代码,它们是 7-10 个字符长的一次性代码,与用户的凭据一起发送到服务器作为帐户恢复过程的一部分。

我不明白这种做法。为什么需要一次性代码?拥有一个多次使用的备用代码不是更简单吗?

2个回答

与 SMS 或电子邮件 OTP 之类的东西相比,我不认为有足够的理由让这些一次性使用,但同样的论点仍然适用。

假设我将代码打印在纸上。然后在恢复过程中,恢复代码通过以下所有节点:

  • 明文:我电脑的键盘、操作系统、浏览器
  • 由 HTTPS 加密:浏览器 --> 服务器的 TLS 端点(例如 CloudFront)
  • 明文:TLS端点-->网络设备-->应用服务器
  • 明文:应用服务器 <--> db <--> 其他内部组件。

关键是即使使用 HTTPS,作为恢复过程的一部分,也有很多节点会将您的代码保存在内存中(或者可能保存在日志中)。如果代码是多用途的,那么您必须相信这些节点中的每一个都是诚实的并且没有感染恶意软件。如果代码是一次性使用的,那么一旦使用它,您就不会关心它是否会出现在日志中或其他任何内容中。

这不是一个坚如磐石的论点,但这是我能想到的最好的。

我不确定您对一种多用途备份代码的确切定义。但就我所知道的用于帐户恢复的备份代码而言,总代码较少可能会更安全一些。该代码在任何时候仅有效一次,但不能多次有效。但是,是的,我认为不需要这么多备用代码,但我确实看到至少需要 2 个备用代码。原因是有些人没有 Fido 密钥、固定电话或相关电话,可以轻松访问。但同样,即使有一个(或两个)备份代码,它也需要尽职尽责地保存在保险箱(或某处)保险箱中。

但我全心全意地认为,某种多因素恢复备份必须到位。理想情况下,我拥有的因素选择越多,我就越不可能被锁定在自己的账户之外。无论是备用代码、固定电话语音呼叫、亲戚的电话或 U2F 硬件密钥或以上所有。2FA 中的第二个因素不能仅仅依赖于您的手机。由于各种原因,人们一直在丢失手机。