如何在软件中用较新的密码散列方法替换旧的密码散列方法?

信息安全 验证 哈希
2021-09-07 12:16:21

我们公司构建的软件刚刚通过了安全审计。审计人员标记了我们使用 MD5 来散列密码,如果用户想要在他们的文件上设置密码,他们可以设置这些密码。看过之后,看来我应该用 PBKDF2 替换它。

但是要从软件中删除所有 MD5 散列方法,这是否意味着用户需要暂时丢失所有密码?例如,我们需要与客户沟通,如果他们更新,他们的所有文件都不会受到密码保护?我的意思是,我可以检查是否存在旧哈希并强制他们手动设置新密码,但任何人都可以设置密码,这似乎是一个很大的缺陷。如果攻击者可以访问他们的文件和我们软件的新版本,他们将无需密码即可访问该文件。

3个回答

这是一个常见的问题。

通常的答案是双重的:

  • 对于自更改后尚未登录的用户:使用旧哈希值作为新哈希方案的输入。
  • 每当有人在更改后登录时:直接使用新密码作为新哈希方案的输入。

使用新表中的附加列来指示新哈希的计算方式。

进一步阅读

为什么不在 MD5 哈希的输出上运行 PBKDF2?生成的哈希应该仍然有效,并且可以用于将旧哈希转换为新哈希,而无需用户重置密码或损害旧用户。

请注意,生成的哈希至少与 PBKDF2 一样安全,并且不应该比普通的 PBKDF2 贵得多(MD5 很容易计算它,因为使用它是一个坏主意)。如果您担心将来会收到有关它的警告,您应该能够解释/标记这是一种在代码中处理事物的安全方式。

请注意,您可以将其与 StackzOfZtuff 的方法结合起来,作为保存尚未更新的用户密码的一种方式,方法是在用户登录 PBKDF2 时更新用户密码,但现在将其更改为 PBKDF2(MD5) 作为一种暂时保持用户密码安全。

我们刚刚实现了这一点——从加盐的 md5 哈希转移到河豚(通过PHP 密码 API)。

我们通过在数据库中放置一个标志来管理迁移 - 如果未设置标志,那么该记录仍在使用盐渍 md5。我们使用旧方法进行身份验证,然后使用新方法重新哈希。我们正在实施一项政策,在此新方法的生产版本修复后,使用旧算法的帐户将其密码字段清空 - 需要设置新密码,并阻止访问,直到它被重置。

PHP 密码 API 工作方式的一个好处是,从散列函数返回的字符串包含有关如何散列的信息(哪种加密方法、方法的参数和盐),以及一个字符串中的所有散列. 这种策略意味着我们可以更改配置文件中的加密方法和参数,并且 API 提供了一个功能,该功能将配置与当前存储值中的参数进行比较,通知您是否需要对新参数进行重新哈希处理。