Database “最佳存储方式”;备份代码“;用于双因素身份验证?

Database “最佳存储方式”;备份代码“;用于双因素身份验证?,database,security,web-applications,two-factor-authentication,Database,Security,Web Applications,Two Factor Authentication,我正在为我的一个辅助项目实施一个双因素身份验证系统,并希望建立一些“一次性代码”,就像谷歌为其双因素身份验证所做的那样 我的问题是,在服务器上存储这些代码最安全的方法是什么?它们是否需要在数据库中加密?我会像散列密码一样使用bcrypt这样的东西来保存它们吗?考虑到攻击者知道每个散列代表一个6位数字,这会使暴力时间几乎为零,我认为这可能有点过分了。这个问题有点模糊,但这里有一些提示: 将认证的至少一部分存储在单独的机器上可降低两个部分同时被泄露的风险 加盐salt可能对您的站点是唯一的,也可能对

我正在为我的一个辅助项目实施一个双因素身份验证系统,并希望建立一些“一次性代码”,就像谷歌为其双因素身份验证所做的那样


我的问题是,在服务器上存储这些代码最安全的方法是什么?它们是否需要在数据库中加密?我会像散列密码一样使用bcrypt这样的东西来保存它们吗?考虑到攻击者知道每个散列代表一个6位数字,这会使暴力时间几乎为零,我认为这可能有点过分了。

这个问题有点模糊,但这里有一些提示:

  • 将认证的至少一部分存储在单独的机器上可降低两个部分同时被泄露的风险
  • 加盐salt可能对您的站点是唯一的,也可能对用户是唯一的,只要您想验证时可以重新创建它。
    • 为什么是盐?字符串
      123456
      的md5hash是
      e10adc3949ba59abbe56e057f20f883e
      ——正如您所说,很容易强制执行。但是如果我添加用户的id呢?您可以将其添加到散列并重新散列,或者将其添加到原始文本中,这样:
      123456aneroid
      的md5hash就是
      74821b76b332b28532136eb58e1b7f40
    • 也可以使用其他附加盐,参见本SO帖子:
  • 数据库应该存储这些数据
  • 你的其中一种盐可能来自第二个凭证
  • 您可以多次重新散列该散列

  • 将一次性代码(OTC)视为密码。现在使用安全性最佳实践来管理密码

    此外,您不应使用6位数字作为OTC。就像我说的,这些是(相当于)密码,你不希望这些密码很弱

    有关如何安全存储密码的更多信息,请参阅