我有一个使用 MD5 进行加盐和散列处理的旧密码数据库。我想更新系统以使数据更安全。
第一个选项是在用户登录时将用户转换为新的哈希方案(Salt + Scrypt 或 PBKDF2 HMACSHA256),并在一段时间后停用旧用户,因此他们必须使用密码恢复功能,该功能会自动更新其哈希值。
允许我立即升级每个人的另一个选择是采用现有的 MD5 哈希值,为每个哈希值添加新的随机盐值,然后使用新的哈希方案(Salt + Scrypt 或 PBKDF2 HMACSHA256)对结果进行哈希处理并存储该值到数据库并删除旧值。
然后,当用户登录时,我必须应用旧方法,然后应用新方法。我更喜欢第二个选项,因为它允许我尽早从数据库中删除所有旧的不安全哈希值。
对现有哈希进行加盐和重新哈希是否安全? MD5 是否已损坏,以至于我可以运行脚本来对密码进行反哈希处理并使用新方案重新哈希它们?
或者也许最好的解决方案是结合使用这两种选项?这样我就不必让数据库中现有的 MD5 哈希值处于不安全状态,并且我可以将用户迁移到新系统一段时间?
MD5 并没有那么糟糕,您可以轻松地对所有密码进行哈希处理,但假设密码的质量不太好,那么您可能会暴力破解它们并将它们转换为新的、更安全的格式。 MD5 的缺陷是由于它的长度相对较小(更多的碰撞面)和计算简单(这意味着暴力攻击比具有较大运行时复杂度的算法(例如 SHA2)更可行)
如果我是你,我会执行你列出的两种方法(因为正如你所提到的,快速转移密码非常重要,以防你的数据库被黑客入侵)。首先,我会暴力破解所有暴力 MD5 密码并将它们转换为新格式。我过去曾这样做过,到目前为止最好的结果是使用HashCat http://hashcat.net/oclhashcat-plus/(最好是 Cuda 或 OCL 风格,因为它们使用 GPU 并且速度快 200 倍)。如果 Hashcat 太难(学习曲线可能很陡),那么尝试。它比 HashCat 慢很多,但是更容易使用。
对于无法破解的密码,请使用户帐户过期并让他们重置密码。或者,为了更好地对待您的用户,只需在用户下次登录时通过发送两个哈希值将数据库中的密码更新为新格式即可。如果 MD5 校验通过,则销毁它并用新格式替换它。这些只是一些想法。
EDIT:
忘记提及的是,如果您只想将 MD5 密码散列为新格式,这在安全性方面就很好,尽管它为您的代码增加了另一层复杂性,并且在复杂性存在的地方就存在实现缺陷的空间。只是需要思考一下。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)