使用SHA-512和salt来散列MD5哈希密码?

我正在使用MD5(无盐)散列用户密码的系统。 我想使用SHA-512和盐更安全地存储密码。

虽然这很容易实现以后的密码,但我还想改进现有的MD5哈希密码,最好不要强迫所有用户更改密码。 我的想法是只使用SHA-512和适当的盐来散列现有的MD5哈希。 然后,我可以在数据库中设置一些标志,指示哪些密码是从纯文本中散列出来的,哪些是从MD5散列中散列出来的。 或者我可以在validation用户时尝试这两种方法。 或者甚至只使用MD5和SHA-512 / salt散列新密码,这样它们就可以像旧密码一样处理。

以编程方式,我认为这不会是一个问题,但我不知道加密/散列是否足以通过将SHA-512 / salt哈希值应用于任何方式来破坏哈希的质量。已经MD5哈希的密码。 我的第一直觉是,如果有的话,它会更强大,一个非常轻的按键伸展。

我的第二直觉是我真的不知道我在说什么,所以我最好得到建议。 有什么想法吗?

具有加密原语的函数组合是危险的,如果可以避免则不应该这样做。 针对您的问题类型的常见解决方案是在迁移期间保留两个哈希值,尽可能使用新哈希并透明地升级旧密码(当您检查密码并匹配时,使用新算法对其进行重新分类并存储它)

如果你有一个基于挑战 – 响应的方案,你不能看到明文密码,但是由于你似乎有一个不会改变的存储盐,我认为你的应用程序会进行散列处理。

如果先使用MD5进行哈希处理,则只能传输MD5(128位)。 SHA512的很大一部分空间不会被您的密码覆盖。 所以你没有利用SHA512,但它不会比MD5差。

你有一个好处,如果有人获得SHA512哈希并且不知道盐(你必须以某种方式执行)无法查找哈希值并获取密码 – 这对于您拥有的MD5数据库是可能的现在。

所以是的,您可以重新使用现有的MD5密码。 但正如第一段所述,将MD5应用于所有新密码并将其哈希为SH512也是一个坏主意。 一个简单的实现是在哈希旁边的数据库中有一个布尔“盐渍”字段(但不要将盐放在那里)。

相信你的第二直觉。 使用专门用于散列密码的现有库,而不是尝试自己烹饪。

可能使用MD5散列您的新密码,然后使用您的密码散列库散列MD5。 这样,您可以保持与旧密码的向后兼容性。

即password_hash(所有旧密码,md5密码)和密码_hash(md5(新密码))

(警告:我不是加密专家)

http://www.codinghorror.com/blog/2007/09/youre-probably-storing-passwords-incorrectly.html

如果你看看大多数银行和高安全性人员如何改变密码。 他们中的大多数人基本上要求使用旧加密方法的人创建新密码。 我认为你首先在所有现有的旧MD5密码用户上放置一个标志的解决方案,并通知他们需要创建新密码并慢慢将它们迁移到新系统。 这样一来,如果出现任何问题,当你遇到系统故障时,你不会问这是一个新用户还是旧用户。 我们是双重哈希还是单一? 永远不要将两个哈希作为一个可能的答案进行比较,因为如果MD5(’abc’)=> 123,SHA(’NO’)=> 123,这意味着某人可能输入了错误的密码但仍然进入。