将 TOTP 机密存储在数据库中,明文还是加密?

信息安全 多因素 顶部
2021-09-06 08:31:19

我一直在阅读有关 2FA 及其使用方式的信息,最让我印象深刻的是每个人似乎都将 TOTP 秘密作为明文存储在他们的数据库中。

我知道您需要将秘密作为明文来验证 OTP,因此您不能对其进行哈希处理,但您是否至少不能以某种方式对其进行加密,以防您的数据库泄露?我觉得有办法让它更安全一些,但我想知道我的想法是否存在缺陷。

  1. 使用存储在服务器上的密钥加密 TOTP 机密:这并不理想,因为您将使用相同的密钥加密所有内容,但如果攻击者没有完全访问服务器上的所有文件,数据库可能会被泄露。在这种情况下,至少 TOTP 机密仍然受到保护。
  2. 使用用户密码加密 TOTP 机密:当用户登录并且密码哈希检查有效时,发送的相同密码可以用作加密/解密 TOTP 机密的密钥。当用户首次设置他的 2FA 时,您要求他们输入密码,以便我们可以使用它来加密 TOTP 机密。当他们使用正确的密码登录时,您可以使用密码解密 TOTP 密码,然后验证 OTP。如果你的数据库被泄露,密码被散列并且 TOTP 秘密被加密,所以攻击者没有任何账户的信息,除非他们知道密码。
  3. 结合这两种方法:将密码与本地存储的密钥结合起来,并将其用作 TOTP 机密的加密密钥。这样,如果数据库泄露并且攻击者知道密码,他们仍然无法解密 TOTP 机密,除非他们有权访问存储的密钥

这是否有任何缺陷,如果有,它们是什么?我觉得任何事情都会比将 TOTP 存储为纯文本更好。

1个回答

您在哪里阅读过有关 2FA 的信息,为什么您认为每个人都以纯文本形式存储密钥?

当您谈论 TOTP 时,您可能应该阅读 RFC4226 和 RFC6238。

是的,例如,Google PAM 模块以纯文本形式将机密存储在用户主目录中。请注意:HOTP 算法是 2005 年发布的,iPhone 1 是 2007 年发布的。我们可以简单地推断,HOTP 算法不适用于智能手机 - 更晚发布的 TOTP 算法也没有。

如果您使用 HOTP/TOTP 在本地计算机上进行身份验证,加密或纯文本的问题就会变得很重要。但 OTP 算法旨在与受信任的后端系统一起使用。本地机器当然不能被信任,因为攻击者可能就坐在这台机器的前面。

查看 RFC4226 的第7.5 节共享机密管理

在这里建议加密共享机密,就像您在 #1 中建议的那样。当然,如果有人获得了加密密钥,那么身份验证就毫无用处。但这是一个后端系统,你需要保护。例如,我们的(免责声明!)开源软件privacyIDEA实际上会加密共享的秘密,如果您想要甚至使用硬件安全模块。(再次 - 这是一个后端系统)

您可能还想了解更多关于 Google Authenticator 设计缺陷的信息:https : //netknights.it/en/the-problem-with-the-google-authenticator/