我有一个旧应用程序,其用户密码存储在数据库中,带有MD5哈希。我想用SHA-2系列中的东西替换它。
我想到了两种可能的方法来实现这一点,但两者看起来都很笨重。
1)添加一个布尔“flag”字段。用户首次在此之后进行身份验证,将MD5密码哈希替换为SHA密码哈希,并设置该标志。然后我可以检查标志以查看密码哈希是否已被转换。
2)添加第二个密码字段以存储SHA哈希。用户第一次在此之后进行身份验证,使用SHA散列密码并将其存储在新字段中(可能同时删除其MD5哈希值)。然后我可以检查SHA字段是否有值;这基本上成了我的旗帜。
在任何一种情况下,对于不经常登录的任何用户,MD5身份验证都必须保留一段时间。任何不再活动的用户永远不会切换到SHA。
有更好的方法吗?
答案 0 :(得分:11)
基本上相同,但可能比添加额外字段更优雅:在Django中的默认身份验证框架中,密码哈希值存储为如下构造的字符串:
hashtype$salt$hash
Hashtype是sha1或md5,salt是用于加密原始密码的随机字符串,最后是哈希本身。示例值:
sha1$a1976$a36cc8cbf81742a8fb52e221aaeab48ed7f58ab4
答案 1 :(得分:6)
如果您通过首先MD5创建未来的密码,则可以通过在数据库中重新分析所有MD5字符串来将其转换为SHA1。检查密码也需要先MD5,但我不认为这是一个很大的打击。
php-code(登录):
分组: $ login =(md5($ password)== $ storedMd5PasswordHash);
后: $ login =(sha1(md5($ password))== $ storedSha1PasswordHash);
也适用于腌制,从here获得初步想法。
答案 2 :(得分:3)
我认为你已经拥有了最好的可能性。我比#2更喜欢#1,因为一旦设置了sha,md5就没用了。
无法反转MD5,因此您必须等待用户再次进行身份验证才能创建新哈希。
答案 3 :(得分:2)
不 - 基本上你必须保持MD5到位,直到你关心的所有用户都被转换。这只是散列的本质 - 您没有足够的信息来再次执行转换。
与其他选项保持一致的另一个选择是使密码字段有效地自我描述,例如
MD5:(md5 hash)
SHA:(sha hash)
然后,您可以轻松地检测用于比较的算法,并避免使用两个字段。再次,你在进行过程中用SHA覆盖MD5。
您需要进行初始更新,以使所有当前密码都声明为MD5。
答案 4 :(得分:0)
你的第二个建议听起来对我来说是最好的。这样,频繁的用户将来会有更安全的体验。
第一个有效的“quirks-mode”是你的代码库,只能确保新用户拥有更好的SHA体验。
答案 5 :(得分:-1)
如果MD5没有加盐,您可以随时使用解密站点/彩虹表,例如:http://passcracking.com/index.php来获取密码。可能更容易使用重新编码方法。
答案 6 :(得分:-4)
是的,在将其转换为sha-1之前,您应先知道真实密码。
如果您想从md5加密字符串中找到真实密码,可以尝试 md5pass.com