security - 如何升级密码存储方案( 更改哈希算法)

  显示原文与译文双语对照的内容

我被要求实现对一个intranet-site的一些更改/更新;使它的成为'未来校样'。

我们发现密码是用MD5算法散列的。 ( 系统自 2001年起就已经存在了,所以在时间上就足够了) 。
我们现在要将hashing-algorithm升级为一个更强的( BCrypt-hash或者 sha-256 ) 。

显然,我们不知道plaintext-passwords并为userbase创建一个新的密码不是一个选项 *)

我的问题是:

公认的方法是什么改变hashing-algorithm没有访问明文密码?
最好的解决方案是完全是'在幕后'的解决方案。

*) 我们尝试,试图说服他们,我们使用'密码期限'的论点,用 Coffee 试图贿赂他们,试图贿赂他们蛋糕, 等等 等等 但不是一个选项。

更新
我希望有某种automagic解决方案来解决这个问题,但显然除了'等待用户登录,然后转换'之外没有其他选项。

至少现在我没有别的解决方案了。

时间:

首先,向数据库添加一个字段,以确定密码是使用MD5还是新算法。

对于仍使用MD5的所有密码:

--在登录过程中,你验证输入的用户密码: 临时存储提交的用户密码在内存( 这里没有安全问题,因为它已经在内存中了) 中,并执行通常的MD5哈希&与存储的哈希比较;

--如果给定了正确的密码( 匹配现有的哈希),则通过新算法运行临时存储的密码,存储该值,更新新字段以标识该密码已经更新到新算法中。

( 当然,你将对新的用户/新密码使用新算法。)

将passwordChange日期时间字段添加到数据库。

所有密码在日X 之前,检查使用 MD5

所有密码都在一天后设置,检查使用BCrypt或者任何。

你可以在散列字段本身中存储( 比如 。 "md5: d41d8cd98f00b204e9800998ecf8427e") 或者其他列中用于创建哈希的算法。 然后你必须修改登录进程,在检查密码时使用正确的算法。 自然,任何新密码都将使用新算法进行散列处理。 希望密码最终会过期,随着时间的推移,所有的MD5哈希都将被淘汰。

因为你不知道明文密码,也许你应该创建一个字段来表示encription版本( 比如 PasswordVersion bit default 0 )

下次用户尝试登录时,使用当前算法版本检查散列密码,就像你今天做的那样。 如果匹配,请再次散列并更新 PasswordVersion 字段。

希望你不需要 PasswordVersion 列大于 bit 。 = )

你应该更改密码数据库以存储 3个项目:

  1. 一个算法标识符。
  2. 当服务器第一次计算和存储密码哈希时,由服务器选择的随机salt字符串。
  3. 使用指定算法的salt+password连接的哈希。

当然,这些只可以用一个分隔符在一个文本字段中存储:

"弹出:this-is-salt: this-is-hash-value"

现在将你现有的条目转换为带有空salt和旧算法的值

"md5:: this-is-the-old-md5-hash-without-salt"

现在你有了足够的信息来验证所有现有的密码条目,但是你也可以验证新条目( 因为你知道使用了哪个散列函数) 。 你可以将旧的条目转换为新的算法,下次用户登录后,你的密码就会在这里过程中可用:

  1. 如果你的数据库表明他们使用的旧算法没有 salt,首先通过检查密码的MD5散列来验证密码是否正确。 如果没有,拒绝登录。
  2. 如果密码被验证,让服务器选择一个随机的salt字符串,计算salt+password的SHA256哈希,并用一个新的算法替换密码表条目,salt和 hash 。
  3. 当用户再次登录时,你将看到他们正在使用新算法,所以计算salt+password的哈希,并检查它是否与存储的哈希匹配。

最后,在系统运行一段时间后,你可以禁用未被转换的帐户( 如果需要的话) 。

在每个条目中添加一个随机的salt字符串使得这个方案更倾向于使用彩虹表进行字典攻击。

我不完全确定这个选项,因为我不是一个密码学专家。 如果我在这里有错,请纠正我 !

我认为 Dave P 有最好的选择。

。但是。有一个automagic解决方案——哈希自己年长的散列。 也就是说,使用当前哈希值,再用更强的算法重新散列它们。 注意,据我理解,你不会得到任何添加安全散列长度,只有增加密码的复杂性的新算法。

问题是,当然,这检查密码就必须经过散列。 你也必须为evey的新密码做同样的事情。 这就是 。 除非你想使用类似于 Dave P的类似方案。 解释为最终使用新的哈希算法返回到single-hashed密码。 在这种情况下,为什么还要考虑? (当然,你可以使用它在一个华丽"改进了所有密码的安全性,立即应用"-way表示企业套装,相对直接的脸。。) !

但是,它是一个可以立即应用到所有当前密码的选项,没有任何渐进的迁移阶段。

哦男孩,但男孩是有人要笑得好开心看代码稍后! : )

...