9

我正在开发一个使用 MD5(无盐)对用户密码进行哈希处理的系统。我想使用 SHA-512 和盐更安全地存储密码。

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

以编程方式,我认为这不会是一个问题,但我对加密/散列的了解不够,无法知道我是否通过将 SHA-512/salt 散列应用于已经经过 MD5 哈希处理的密码。我的第一直觉是,如果有的话,它会更强大,一个非常轻的键伸展。

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

4

4 回答 4

5

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

如果您有一个基于质询-响应的方案,而您看不到明文密码,这将不起作用,但由于您似乎有一个不会更改的存储盐,我假设您的应用程序会进行哈希处理。

于 2012-04-05T12:26:04.087 回答
4

如果你先用 MD5 散列,你将只有 MD5(128 位)的传播。SHA512 的大部分空间不会被您的密码覆盖。所以你不利用SHA512,但不会比MD5差。

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

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

于 2012-04-05T12:22:03.443 回答
1

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

可能使用 MD5 对您的新密码进行哈希处理,然后使用您的密码哈希库对 MD5 进行哈希处理。这样,您可以保持与旧密码的向后兼容性。

即password_hash(所有旧的,md5'd密码)和password_hash(md5(新密码))

(警告:我不是密码学专家)

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

于 2012-04-05T12:11:55.167 回答
0

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

于 2012-04-05T12:26:30.693 回答