5

我正在阅读一些关于密码散列的内容。我已经看到 SHA-256 > MD5。这让我开始思考一个应用程序如何处理从一个散列函数到另一个散列函数的变化。如果有人实现了一个使用 MD5 对他们的密码进行哈希处理的应用程序会发生什么。然后他们决定 SHA-256 是要走的路。当然,存储在数据库中的密码哈希值是 MD5 格式的。

将数据库中的数据从一个散列函数迁移到另一个散列函数的过程是什么?

4

1 回答 1

5

不可能“解散”密码(至少不是以一种通用、高效和可靠的方式——您可以猜出一些密码,这就是攻击者所做的,并且您想要从 MD5 迁移正是因为攻击者可能在这方面取得了一些成功)。因此迁移将随着时间的推移而分散:一些密码将使用 MD5 进行散列,其他使用 SHA-256。验证密码时:

  • 如果该密码的 SHA-256 已知,则使用 SHA-256。此密码已迁移。
  • 否则,使用 MD5 来检查密码。如果匹配,则密码是正确的,并且由于当时应用程序知道密码,因此应用程序还会使用 SHA-256 对密码进行哈希处理,并将 MD5 哈希值替换为数据库中的 SHA-256 哈希值。

因此,密码是动态迁移的;要完全摆脱 MD5,您必须等待很长时间和/或销毁长时间未访问的帐户。您需要能够区分 MD5 哈希和 SHA-256 哈希,这很容易,因为它们具有不同的大小(MD5 为 16 字节,SHA-256 为 32 字节)。您还可以添加标志或任何其他类似的噱头。

请注意,使用散列函数的原始单个应用程序散列密码是一种非常糟糕的做法,从安全角度来看,用 SHA-256 替换 MD5 并不会真正改善事情。您对密码进行哈希处理,以便获得数据库读取权限的攻击者不会自己学习密码。要真正防止攻击者猜出密码,您还需要“盐”(每个密码的随机数据,与散列密码一起存储)和一个适当的散列函数(即数千甚至数百万的嵌套散列函数调用)。有关详细信息,请参阅此答案。简短的回答:既然您正在设想迁移,请做聪明的事情并迁移到bcrypt,而不是 SHA-256(请参阅security.stackexchange上的答案)。

于 2011-09-25T14:15:32.623 回答