通过链接 MD5 和 Bcrypt 将密码 db 从 MD5 迁移?

信息安全 密码 md5
2021-09-10 02:54:49

我有一个旧系统当前存储未加盐的 MD5 密码。不幸的是,其他一些控件没有到位(比如密码过期的能力),我正在尝试将我的算法升级到更新的东西,并避免提示用户输入新密码。

我想知道如果我只是在当前的 MD5 哈希上使用 bcrypt 之类的东西会产生什么影响。换句话说:

  1. 用户提交明文密码
  2. 密码使用 MD5 散列
  3. MD5 哈希使用 bcrypt 进行哈希处理
  4. 用于身份验证的哈希值比较

这是否会以某种方式“减少”生成的 bcrypt 哈希的强度?

2个回答

你最终会得到的是在将用户密码输入 BCrypt 之前对用户密码进行 MD5 处理。

虽然 MD5 是一种快速且严重损坏的算法,但它不会从密码中删除任何熵(除非它们的熵超过 128 位,但普通用户的密码会少得多)。所以你输入 BCrypt 的熵仍然是一样的。

当攻击者窃取您的数据库并想要暴力破解它时,他们仍然需要运行 BCrypt,而不是在 100 万个最常见的密码上运行它,而是在 100 万个最常见的密码的 MD5 哈希上运行它。这不会花费更长的时间,但也不会花费更短的时间。

所以在我看来,你的计划确实没有错。

首先,请看这个问题和我的回答,因为我认为它涵盖了你的大部分问题。

很高兴您想从未加盐的 MD5 更新您的密码 db。由于您没有使用户密码过期的能力,因此您要确保数据库中没有密码被保留为未加盐的 MD5。

您基本上有 3 个选项来执行此操作:

  1. 通过在数据库上运行脚本以双重哈希他们当前的 MD5 哈希并存储在数据库中,立即将每个人转移到 BcryptBcrypt(MD5($passwd))在他们第一次登录时,您会看到他们的明文密码可以选择将其移动到Bcrypt($passwd),或者您可以永远保留双重哈希。

  2. 将每个人的密码保留为数据库中的 MD5,并在下次登录时将其更新为 Bcrypt

  3. 做 1. 或 2. 加上密码过期,这将从数据库中删除他们的哈希,如果他们在 X 时间之后没有登录,则强制他们进行恢复


优点缺点

  1. 安全社区普遍认为“双重哈希”很好——它不会给你更多的安全性,但也不会削弱你的安全性。以下是有关该主题的两个有关 crypto.SE 的问题:[更多数学][更多解释性]这里的好处是,如果您的密码哈希数据库明天被盗,您的所有用户都会受到最新技术的保护,无论他们最近是否登录。考虑到即使用户 5 年没有登录,他们可能仍然在其他网站上使用该密码,这真是太好了。另一个好处是,如果您选择使用该Bcrypt(MD5($passwd))选项,那么您实际上不需要任何数据库架构更改。我会做这个选项。

  2. 如上所述,此选项对未再次登录的用户没有任何保护,并且需要更改 db 架构以跟踪谁在 MD5 上,以及谁在 Bcrypt 上。此外,如果您的密码数据库在几个月/几年后被盗,黑客将看到哪些用户在 MD5 上并会首先破解他们的密码,因此您实际上是在抛弃那些再也不会登录的用户的安全性 -如上所述,这是一个问题,因为用户倾向于在站点之间重复使用密码。总体而言,此选项在降低安全性的情况下工作更多,我认为这对您的用户不负责任

  3. 如果您愿意使密码过期,那么将其与 1. 结合起来可以为您提供维护选项,并且实际上使 2. 成为一个可行的选项,因为所有 MD5 哈希值都会在一段时间后从您的数据库中消失。但既然你说到期不是一种选择,我不会在这个问题上徘徊。


您要考虑的另外两件事是:

  • 无论您是否想从您的登录代码中停用 MD5,或者您是否愿意Bcrypt(MD5($passwd))永远这样做。我认为删除 MD5 步骤没有任何安全原因,但是如果您确实想停用 MD5,那么您必须在用户第一次登录时做一些棘手的事情,添加一个 db 列来跟踪他们是哪种哈希方法使用等

  • 考虑一下 5 年后当我们发现 bcrypt 中的一些缺陷并且每个人都转向新的全能 SuperHash 时你将要做什么。如果你正在存储Bcrypt(MD5($passwd)),那么你可以做同样的技巧并移动到SuperHash(Bcrypt(MD5($passwd))),一切都会好起来的。但是,如果您选择将用户移动到清洁器,Bcrypt($passwd)那么您必须对 db 列做一些更棘手的事情,因为有一个很好的改变,您将让从未登录的用户更新到新的哈希值。