我有一个具有存储在数据库中与MD5哈希用户密码的旧的应用程序。 我想用在SHA-2家族东西来取代这一点。
我想到了两种可能的方式来做到这一点,但似乎都非常笨拙。
1)添加一个布尔“标志”字段。 第一次用户在此之后进行身份验证,请用SHA哈希密码的MD5哈希密码,并设置标志。 然后我可以检查标志,以查看密码哈希是否已经转换。
2)添加第二个密码字段来存储SHA散列。 第一次用户在此之后进行身份验证,哈希与SHA密码并将其存储在新的领域(可能在同一时间删除其MD5哈希值)。 然后,我可以检查SHA字段是否具有价值; 这实质上已成为我的标志。
在这两种情况下,MD5认证将不得不留在原地一段时间,谁不经常登录的所有用户。 又是谁已不再活跃的任何用户将永远不会被切换到SHA。
有一个更好的方法吗?
本质上是相同的,但也许不是增加额外的字段更优雅:在默认身份验证framwork 的Django ,密码哈希存储为这样的构造字符串:
hashtype$salt$hash
Hashtype或者是SHA1或MD5,盐是用来盐的原始密码和最后一个随机字符串自带的哈希本身。 值示例:
sha1$a1976$a36cc8cbf81742a8fb52e221aaeab48ed7f58ab4
您可以通过在你的数据库换汤不换药他们,如果你先MD5ing他们创造你的未来的密码你所有的MD5字符串转换为SHA1。 检查密码需要MD5ing他们先还,但我不认为这就是一个很大的打击。
PHP-代码(登录):
分组:$登录名=(MD5($密码)== $ storedMd5PasswordHash);
后:$登录名=(SHA1(MD5($密码))== $ storedSha1PasswordHash);
盐析也适用,从得到了最初的想法在这里 。
我想你已经得到了最好的准备。 我喜欢#1比#2以上,因为一旦SHA设置有针对MD5没有用。
有没有办法扭转MD5,所以你必须等待用户再次进行身份验证,以创建一个新的哈希值。
否 - 基本上你就必须保持MD5到位,直到所有你关心的已转换用户。 这就是散列的只是本质 - 你没有足够的信息来再次执行转换。
在-保持与其他人另一种选择是让密码字段有效的自我描述,如
MD5:(md5 hash)
SHA:(sha hash)
然后,您可以很容易地检测要使用比较哪种算法,并避免两个字段。 同样,你会覆盖与SHA的MD5,你就跟着去了。
你想要做一个初始更新,使所有当前密码宣布自己为MD5。
你的第二个建议听起来最好的给我。 这样频繁的用户将可以在未来更安全的体验。
第一个有效的“怪癖模式”的代码库,只有确保新用户有更好的体验SHA。
如果MD5的不加盐,你可以随时使用解密网站/彩虹表,如: http://passcracking.com/index.php拿到密码。 可能更容易,只需使用的重新编码方法虽然。
是的,你应该知道真正的密码,您将它转换成SHA-1之前,首先..
如果你想找到MD5加密的字符串,真正的密码,你可以尝试md5pass.com