如何升级密码存储方案(修改散列算法)(How to upgrade a password stora

2019-08-17 11:24发布

我一直在问到实施一些更改/更新到Intranet站点; 让它“面向未来”,因为他们把它。

我们发现,密码使用MD5算法散列。 (该系统已自2001年所以这是足够的时间)。
我们现在想的哈希算法升级到更强的(BCrypt散列或SHA-256)。

显然,我们不知道明文,密码和创建的用户群新的密码是不是一种选择 *)。

所以,我的问题是:

什么是改变散列算法,而无需访问明文密码接受的方式?
最好的解决方案将是一个解决方案,完全是“幕后”。

*) 我们尝试了; 试图说服他们,我们用“密码时代”的说法,试图用咖啡来贿赂他们,试图与蛋糕,等等,等等贿赂他们,但它不是一个选项

更新
我希望的某种解决该问题的解决方案AUTOMAGIC的,但显然没有其他的选择不只是“等待用户登录,然后再转换”。

好了,现在我至少现在还没有其他可用的解决方案。

Answer 1:

首先,一个字段添加到数据库以识别密码是否被使用MD5或新算法。

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

- 在登录过程中,在那里你验证用户输入的密码:临时存储在内存中的用户提交的密码(无安全问题在这里,因为它已经在内存的某个地方),并做平常MD5哈希和与存储的哈希值进行比较;

- 如果正确的密码被赋予(现有的哈希值匹配),通过新的算法运行临时存储的密码,存储值,更新新的字段来标识,这个密码已更新为新的算法。

(当然,你只需使用新的算法为所有新用户/新口令。)



Answer 2:

我不能完全肯定这个选项,因为我不是在加密方面的专家。 请纠正我,如果我错了,在这里的一些点!

我觉得戴夫P.显然已经是最好的选择。

......但是。 有一个AUTOMAGIC解决方案 - 哈希旧的哈希自己。 也就是说,以目前的哈希值,并具有更强的算法再次哈希他们。 请注意,据我了解,你没有得到哈希长度这里的任何增加安全性,只有新算法的加密码学的复杂性。

问题是,当然,前提是检查密码将不得不去通过两个哈希值。 而且你必须做同样的埃维新密码。 这是,嗯,非常愚蠢的 。 除非你想用象戴维P.类似的方案说明最终毕业回单哈希密码与新的哈希算法......在这种情况下,为什么还要用这个麻烦? ( - 在演示企业西装方式,具有相对着脸......当然,你可以使用它在一个华丽的“安全性提高了所有密码,立即生效!”)

不过,这是可以立即应用于目前所有的密码,没有任何逐渐迁移阶段的选项。

但是男孩,男孩哦,是有人将有一个很好笑以后看代码! :)



Answer 3:

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

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

天X后设置的密码时,请用BCrypt或什么的。



Answer 4:

你可以存储,无论是在哈希场本身(例如“MD5:d41d8cd98f00b204e9800998ecf8427e”),或在另一列,用哪种算法创建哈希值。 然后,你就必须修改登录过程中检查密码时要使用正确的算法。 当然,任何新的密码将使用新的算法被散列。 我们希望, 最终密码过期,并且随着时间的推移所有的MD5哈希值的将被淘汰。



Answer 5:

既然你不知道明文密码,也许你应该创建这表明encription版本(如现场PasswordVersion bit default 0

下一次用户试图登录,使用当前版本的算法校验散列密码,就像你今天做。 如果匹配,再散列它和更新PasswordVersion领域。

希望你会不会需要一个PasswordVersion列比我的大bit 。 =)



Answer 6:

您应该更改您的密码数据库来存储3个项目:

  1. 算法标识符。
  2. 由服务器选择时它首先计算并存储密码哈希随机盐字符串。
  3. 盐+密码的级联的使用指定的算法的散列。

当然,这些可能只是一起存储在同一个分隔符一个文本字段:

“SHA256:这-是盐:此-是散列值”

现在转换您现有条目与空的盐和老算法的值

“MD5 ::这 - 是最老的MD5哈希 - 没有盐”

现在,你有足够的信息来验证你现有的密码条目,但你也可以验证新的条目(因为你知道使用哪些哈希函数)。 您可以将旧条目下一次的现有用户登录,因为你将不得不在这个过程中提供其密码转换为新的算法:

  1. 如果你的数据库表明他们正在使用的旧算法,无盐,首先验证密码通过检查密码的MD5哈希值相匹配的老路上。 如果没有,拒绝登录。
  2. 如果密码进行验证,在服务器选择一个随机字符串盐,计算盐+密码的哈希SHA256,并更换一个新的密码表项specifiy新算法,盐和哈希值。
  3. 当用户再次登录时,你会看到他们使用的是新的算法,因此计算盐+密码的哈希值,检查它存储的哈希相匹配。

最终,该系统已经运行了一个合适的时间后,你可以禁用尚未转换(如果需要)账户。

添加一个随机字符串盐唯一的每个条目,使该方案更加性能稳定的使用彩虹表字典攻击。



Answer 7:

最好的答案是从实际的密码专家https://paragonie.com/blog/2016/02/how-safely-store-password-in-2016#legacy-hashes

这个帖子也有助于解释你应该使用的哈希。 它仍然是目前即使说2016年如果有疑问使用bcrypt。

您的用户帐户的表,称为legacy_password(或同等学历)添加一列。 这仅仅是一个布尔

计算现有密码哈希的新的更强的哈希并将其存储在数据库中。

修改您的验证码来处理遗留标志。

当用户试图登录,首先检查如果legacy_password标志。 如果是,先预哈希他们使用旧的密码散列算法的密码,然后代替密码的使用prehashed值。 后来(MD5),重新计算新的哈希和存储新的哈希数据库,禁用legacy_password标志的过程中。



文章来源: How to upgrade a password storage scheme (change hashing-algorithm)