如何将密码哈希从MD5转换为SHA?

时间:2009-09-04 20:42:34

标签: passwords md5 hash sha

我有一个旧应用程序,其用户密码存储在数据库中,带有MD5哈希。我想用SHA-2系列中的东西替换它。

我想到了两种可能的方法来实现这一点,但两者看起来都很笨重。

1)添加一个布尔“flag”字段。用户首次在此之后进行身份验证,将MD5密码哈希替换为SHA密码哈希,并设置该标志。然后我可以检查标志以查看密码哈希是否已被转换。

2)添加第二个密码字段以存储SHA哈希。用户第一次在此之后进行身份验证,使用SHA散列密码并将其存储在新字段中(可能同时删除其MD5哈希值)。然后我可以检查SHA字段是否有值;这基本上成了我的旗帜。

在任何一种情况下,对于不经常登录的任何用户,MD5身份验证都必须保留一段时间。任何不再活动的用户永远不会切换到SHA。

有更好的方法吗?

7 个答案:

答案 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