我一直在阅读有关 2FA 及其使用方式的信息,最让我印象深刻的是每个人似乎都将 TOTP 秘密作为明文存储在他们的数据库中。
我知道您需要将秘密作为明文来验证 OTP,因此您不能对其进行哈希处理,但您是否至少不能以某种方式对其进行加密,以防您的数据库泄露?我觉得有办法让它更安全一些,但我想知道我的想法是否存在缺陷。
- 使用存储在服务器上的密钥加密 TOTP 机密:这并不理想,因为您将使用相同的密钥加密所有内容,但如果攻击者没有完全访问服务器上的所有文件,数据库可能会被泄露。在这种情况下,至少 TOTP 机密仍然受到保护。
- 使用用户密码加密 TOTP 机密:当用户登录并且密码哈希检查有效时,发送的相同密码可以用作加密/解密 TOTP 机密的密钥。当用户首次设置他的 2FA 时,您要求他们输入密码,以便我们可以使用它来加密 TOTP 机密。当他们使用正确的密码登录时,您可以使用密码解密 TOTP 密码,然后验证 OTP。如果你的数据库被泄露,密码被散列并且 TOTP 秘密被加密,所以攻击者没有任何账户的信息,除非他们知道密码。
- 结合这两种方法:将密码与本地存储的密钥结合起来,并将其用作 TOTP 机密的加密密钥。这样,如果数据库泄露并且攻击者知道密码,他们仍然无法解密 TOTP 机密,除非他们有权访问存储的密钥
这是否有任何缺陷,如果有,它们是什么?我觉得任何事情都会比将 TOTP 存储为纯文本更好。