2017-09-05 67 views
0

我正在使用Google Authenticator在我们的网站上实现2FA。如果我理解正确,每个用户都将拥有自己的密码,我将在登录时验证他们输入的6位密码。2FA密码应该散列存储吗?

在同一个数据库中存储这些秘密代码作为用户的密码似乎是一个坏主意(不过,如果有人得了我们有更大的问题数据库的保持),反正是有它周围?或者他们应该被视为密码和加密?

回答

2

您无法散列用于生成谷歌身份验证器TOTP代码,因为你需要的隐密实际生成的代码的秘密。

这几乎是像你说的,如果有人有你的数据库,然后你在更大的麻烦呢。但是,这是2因子认证应该如何工作的。如果密码确实被安全散列并且攻击者只有TOTP密码,那么他们所能做的只是在登录所需的两个因素中生成1个密码,并且他们还有更多的工作要做,以破解或窃取密码。

如果你不想为你的用户存储这些秘密并让第三方处理它,我可以推荐你看看Twilio's Two Factor Authentication API。充分披露,我为Twilio工作,但如果你不想担心你不能哈希,以及利用其他东西,如Authy app(不QR码包括密传)秘密照顾和extra device data that is now available with authentications那么它可能是有趣的。

0

我希望这两个因素码是紧紧时间限制(例如:5分钟),这在我看来是一个足够的缓解。例如,获取数据库的黑客只能在访问后的很短时间内使用代码。老实说,这是不可能的,他会在那个时间段的任何用户的第一因素(密码)(假设你不这样做密码哈希the wrong way),所以第二个因素甚至不发挥作用在这种情况下。

(此参数是独立的,对于一个6位数代码蛮力搜索空间是非常小的点)

如果不是有时间限制的,那么你应该考虑实现自己的超时,而不是散列值。散列对于具有长寿命的数据更好。