我一直在问到实施一些更改/更新到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个项目:
- 算法标识符。
- 由服务器选择时它首先计算并存储密码哈希随机盐字符串。
- 盐+密码的级联的使用指定的算法的散列。
当然,这些可能只是一起存储在同一个分隔符一个文本字段:
“SHA256:这-是盐:此-是散列值”
现在转换您现有条目与空的盐和老算法的值
“MD5 ::这 - 是最老的MD5哈希 - 没有盐”
现在,你有足够的信息来验证你现有的密码条目,但你也可以验证新的条目(因为你知道使用哪些哈希函数)。 您可以将旧条目下一次的现有用户登录,因为你将不得不在这个过程中提供其密码转换为新的算法:
- 如果你的数据库表明他们正在使用的旧算法,无盐,首先验证密码通过检查密码的MD5哈希值相匹配的老路上。 如果没有,拒绝登录。
- 如果密码进行验证,在服务器选择一个随机字符串盐,计算盐+密码的哈希SHA256,并更换一个新的密码表项specifiy新算法,盐和哈希值。
- 当用户再次登录时,你会看到他们使用的是新的算法,因此计算盐+密码的哈希值,检查它存储的哈希相匹配。
最终,该系统已经运行了一个合适的时间后,你可以禁用尚未转换(如果需要)账户。
添加一个随机字符串盐唯一的每个条目,使该方案更加性能稳定的使用彩虹表字典攻击。
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)