是否应该对 2FA 密码进行散列存储?

bla*_*ird 10 security two-factor-authentication laravel-5

我正在我们的网站上使用 Google Authenticator 实施 2FA。如果我理解正确,每个用户都有自己的密码,我需要在登录时验证他们输入的 6 位密码。

将这些密码与用户密码存储在同一个数据库中似乎是一个坏主意(虽然,如果有人掌握了数据库,我们会遇到更大的问题),是否还有办法解决?还是应该将它们视为密码并进行加密?

phi*_*ash 10

您无法对用于为 Google 身份验证器生成 TOTP 代码的密钥进行哈希处理,因为您需要原始密钥才能实际生成代码。

正如您所说,如果有人拥有您的数据库,那么无论如何您都会遇到更大的麻烦。然而,这就是 2 因素身份验证应该如何工作。如果密码确实被安全地散列并且攻击者只有 TOTP 秘密,那么他们所能做的就是生成登录所需的 2 个因素中的 1 个,并且他们有更多的工作要做来破解或窃取密码。

如果您不想担心为您的用户存储这些机密并让第三方处理它,我可以建议您查看Twilio 的双因素身份验证 API。完全公开,我为 Twilio 工作,但如果您不想担心处理无法散列的秘密,以及利用其他功能,例如Authy 应用程序(包括没有二维码的秘密传输)和现在可用于身份验证的额外设备数据,那么它可能会引起人们的兴趣。