我正在使用MD5(无盐)对用户密码进行哈希处理的系统。我想使用SHA-512和盐更安全地存储密码。
虽然这很容易实现以后的密码,但我还想改进现有的MD5哈希密码,最好不要强迫所有用户更改密码。我的想法是只使用SHA-512和适当的盐来散列现有的MD5哈希值。然后我可以在数据库中设置一些标志,指示哪些密码是从纯文本中散列出来的,哪些是从MD5散列中散列出来的。或者我可以在验证用户时尝试这两种方法。或者甚至只使用MD5和SHA-512 / salt散列新密码,这样它们就可以像旧密码一样处理。
以编程方式,我认为这不会是一个问题,但我对加密/散列知之甚少,以了解我是否通过应用SHA-512 / salt以任何方式损害散列的质量哈希到已经MD5哈希的密码。我的第一直觉是,如果有的话,它会更强大,一个非常轻的按键伸展。
我的第二直觉是我真的不知道我在说什么,所以我最好得到建议。有什么想法吗?
答案 0 :(得分:5)
具有加密原语的函数组合是危险的,如果可以避免则不应该这样做。针对您的问题类型的常见解决方案是在迁移期间保留两个哈希值,尽可能使用新哈希并透明地升级旧密码(当您检查密码并匹配时,将其与新算法重新组合并存储)< / p>
如果你有一个基于挑战 - 响应的方案,你不会看到明文密码,但是由于你似乎有一个不会改变的存储盐,我认为你的应用程序会进行散列
答案 1 :(得分:4)
如果先使用MD5进行哈希处理,则只能传输MD5(128位)。 SHA512的很大一部分空间不会被您的密码覆盖。所以你没有利用SHA512,但它不会比MD5差。
如果有人获得SHA512哈希并且不知道盐(这是你必须以某种方式强制执行),那么你可以获得以下好处:无法查找哈希值并获取密码 - 这是MD5可能实现的你现在拥有的数据库。
所以,是的,你可以重新使用现有的MD5密码。但正如第一段所述,将MD5应用于所有新密码并将其哈希为SH512将是一个坏主意。一个简单的实现是在哈希旁边的数据库中有一个布尔“盐渍”字段(但不要把盐放在那里)。
答案 2 :(得分:1)
相信你的第二直觉。使用专门用于散列密码的现有库,而不是尝试自己烹饪。
可能使用MD5散列您的新密码,然后使用您的密码散列库散列MD5。这样,您就可以保持与旧密码的向后兼容性。
即。 password_hash(所有旧密码,md5密码)和密码_hash(md5(新密码))
(警告:我不是加密专家)
http://www.codinghorror.com/blog/2007/09/youre-probably-storing-passwords-incorrectly.html
答案 3 :(得分:0)
如果你看看大多数银行和高安全性人员如何更改密码。他们中的大多数人基本上要求使用旧加密方法的人创建新密码。我认为您首先在所有现有的旧MD5密码用户上放置一个标志的解决方案,并通知他们需要创建新密码并将其慢慢迁移到新系统。这样当你出现问题时,如果出现任何问题,你就不会问这个新用户还是旧用户。我们是双重哈希还是单一?不应该将两个哈希作为可能的答案进行比较,因为如果MD5('abc')=&gt; 123,SHA('NO')=&gt; 123,这意味着某人可能输入了错误的密码但仍然进入。