【问题标题】:Changing the hashing function on a pre-existing database更改预先存在的数据库上的散列函数
【发布时间】:2011-11-24 14:48:26
【问题描述】:

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

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

【问题讨论】:

  • 我认为这不可能。

标签: security hash passwords md5 sha


【解决方案1】:

不可能“解散”密码(至少不是以一种通用、高效和可靠的方式——您可以猜出一些密码,这就是攻击者所做的,并且您想从中迁移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 并不会真正改善问题。您对密码进行哈希处理,以便获得数据库读取权限的攻击者不会自己学习密码。为了真正防止攻击者猜出密码,你还需要“salts”(每个密码的随机数据,与散列密码一起存储)和一个合适的 slow 散列函数(即数千,可能是数百万的嵌套散列函数调用)。有关详细信息,请参阅this answer。简短的回答:既然您正在设想迁移,请明智地迁移到 bcrypt,而不是 SHA-256(请参阅 security.stackexchange 上的 that answer)。

【讨论】:

  • 我将通过指出 bcrypt 也没有此迁移问题来补充 Thomas 的出色回答。如果您想增加密码的工作系数,您可以通过在进行初始哈希时更改工作系数值来实现。从那时起,所有未来的密码都将作为新的工作因素级别进行散列,但在检查密码时,新工作因素和旧工作因素散列仍然有效,因此您只需将所有密码设置为 3 个月的到期时间。那么所有密码都应该在三个月内达到新的工作系数。然后删除或禁用旧的
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-11-25
  • 2015-06-28
  • 1970-01-01
  • 2019-01-14
  • 1970-01-01
  • 2015-09-27
  • 1970-01-01
相关资源
最近更新 更多