Use SHA-512 and salt to hash an MD5 hashed password?
我正在开发一个使用MD5(无salt)散列用户密码的系统。我想使用sha-512和salt更安全地存储密码。
虽然这很容易为将来的密码实现,但我还想修改现有的MD5哈希密码,最好不要强制所有用户更改其密码。我的想法是只使用sha-512和适当的salt来散列现有的MD5散列。然后,我可以在数据库中设置一些标志,指示哪些密码是从纯文本散列的,哪些密码是从MD5散列散列的。或者我可以在认证用户时同时尝试这两种方法。或者,甚至只需使用MD5散列新密码,然后使用sha-512/salt,这样就可以将它们视为旧密码。
从程序上讲,我不认为这会是一个问题,但我对加密/散列的了解不够,不知道我是否会通过将sha-512/salt散列应用到已进行MD5散列的密码来以任何方式损害散列的质量。我的第一直觉是,如果有什么,它会更强大,一个非常轻的关键伸展。
我的第二本能是我不知道自己在说什么,所以我最好得到建议。有什么想法吗?
带有加密原语的函数组合是危险的,如果可以避免,则不应进行此操作。对于您的问题类型,常见的解决方案是在迁移期间保留这两个哈希,尽可能使用新的哈希并透明地升级旧密码(当您检查密码并且密码匹配时,用新算法重新刷新它并存储它)。
如果您有一个基于挑战响应的方案,在该方案中您无法看到纯文本密码,那么这将不起作用,但是由于您似乎有一个不更改的存储salt,所以我假设您的应用程序执行散列。
如果首先使用MD5散列,则只能使用MD5(128位)的排列。您的密码不会覆盖sha512的大部分空间。所以你不能利用sha512,但它不会比md5更糟。
这样做的好处是,如果有人获得了sha512哈希,并且不知道salt(您必须以某种方式强制执行此操作),那么就无法查找哈希和获取密码——这在您现在拥有的MD5数据库中是可能的。
所以是的,您可以重新刷新现有的MD5密码。但正如第一段中所解释的,将MD5应用于所有新密码,然后将其作为SH512散列是一个坏主意。一个简单的实现是在数据库中哈希旁边有一个布尔"salted"字段(但不要将salt放在那里)。
相信你的第二本能。使用一个专门为散列密码而设计的现有库,而不是自己编写。
可能用MD5散列新密码,然后用密码散列库散列MD5。这样,您就可以保持与旧密码的向后兼容性。
即密码哈希(所有旧的、MD5'd的密码)和密码哈希(MD5(新密码))。
(警告:我不是密码专家)
http://www.codingsurror.com/blog/2007/09/youre-probable-storeing-passwords-incorrectly.html
如果你看看大多数银行和高安全性的人是如何更改密码的。他们中的大多数人基本上都会问那些使用旧的加密方法来创建新密码的人。我认为您首先应该在所有现有的旧MD5密码用户上放置一个标志,并通知他们需要创建新密码,然后慢慢地将其迁移到新系统。这样,当您在系统出现故障时,如果出现任何问题,您将不会询问这是新用户还是旧用户。我们是双排还是单排?不应该将两个哈希作为可能的答案进行比较,因为如果md5("abc")=>123,sha("no")=>123,这意味着可能有人输入了错误的密码,但仍然可以输入。