代码之家  ›  专栏  ›  技术社区  ›  Bruce Alderman

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

  •  15
  • Bruce Alderman  · 技术社区  · 15 年前

    我有一个旧的应用程序,它的用户密码存储在带有MD5哈希的数据库中。我想把这个换成沙二家的东西。

    我想了两种可能的方法来实现这一点,但这两种方法都显得相当笨拙。

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

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

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

    有更好的方法吗?

    7 回复  |  直到 14 年前
        1
  •  11
  •   Jørn Schou-Rode dscher    15 年前

    本质上相同,但可能比添加额外字段更优雅:在默认身份验证框架中 Django ,密码散列存储为如下构造的字符串:

    hashtype$salt$hash
    

    hashtype是sha1或md5,salt是一个随机字符串,用于对原始密码加盐,最后是哈希本身。实例值:

    sha1$a1976$a36cc8cbf81742a8fb52e221aaeab48ed7f58ab4
    
        2
  •  6
  •   Community    7 年前

    如果您通过首先使用MD5创建未来的密码,则可以通过在数据库中重新显示MD5字符串来将所有MD5字符串转换为SHA1。检查密码也需要MD5ing,但我认为这不是一个大的打击。

    PHP代码(登录):

    PREV: $login=(md5($password)==$storedmd5passwordhash);

    后: $login=(sha1(md5($password))==$storedsha1passwordhash);

    也和盐渍一起工作,从 here .

        3
  •  3
  •   Ned Batchelder    15 年前

    我想你已经有了最好的可能性。我更喜欢1而不是2,因为一旦设置了sha,MD5就没有用处了。

    无法反转MD5,因此您必须等待用户再次进行身份验证以创建新的哈希。

        4
  •  2
  •   Jon Skeet    15 年前

    不-基本上你必须保持MD5的位置,直到你关心的所有用户都被转换。这就是散列的本质——您没有足够的信息来再次执行转换。

    与其他人保持一致的另一种选择是使密码字段有效地自我描述,例如

    MD5:(md5 hash)
    SHA:(sha hash)
    

    然后您可以很容易地检测出用于比较的算法,并避免使用两个字段。同样,您将在进行过程中用sha覆盖MD5。

    您需要进行初始更新,使所有当前密码都声明为MD5。

        5
  •  0
  •   Jeff Wilcox    15 年前

    你的第二个建议对我来说是最好的。这样,频繁的用户在未来将有更安全的体验。

    第一个有效的“怪癖模式”是你的代码库,只确保新用户有更好的sha体验。

        6
  •  -1
  •   Meep3D    15 年前

    如果MD5没有加盐,您可以使用解密站点/彩虹表,例如: http://passcracking.com/index.php 获取密码。不过,使用重新编码方法可能更容易。

        7
  •  -4
  •   liputra    14 年前

    是的,在将其转换为sha-1之前,您应该首先知道真正的密码。

    如果您想从MD5加密字符串中找到真正的密码,可以尝试 md5pass.com