【问题标题】:Most efficient way to change the hash type of a password (md5 to sha1)更改密码哈希类型的最有效方法(md5 到 sha1)
【发布时间】:2013-05-27 15:47:40
【问题描述】:

我有一个系统使用 MD5 对来自我的用户的密码进行哈希处理并将其存储到我的数据库中。 现在,我将更改为使用 SHA1(和唯一系统 SALT,而不是用户唯一)的另一个系统来散列密码。

如何使用 PHP 将用户旧的 MD5 密码变成我的新 SHA1 密码?

【问题讨论】:

  • 为什么简单地从 MD5 切换到 SHA1(即使使用盐)?两者都有缺陷? password_compat (github.com/ircmaxell/password_compat) 是一个更好的选择,并且还可以为您提供很好的面向未来的能力
  • 感谢您的建议,@MarkBaker,但 SHA1 哈希方法是系统要求之一。另外,由于我什至不能直接从 md5 切换到 sha1,所以我在更改哈希类型和调整系统时会遇到更多麻烦;)另外,我需要一个快速的解决方案。

标签: php database hash md5 sha1


【解决方案1】:

您无法将md5 转换为sha,但实际上您的用户只有在about to login 时才使用密码,因此您可以稍微修改脚本以自动更新

// The user is not authticated yet
$auth = false;
$updated = false;

// From your Login form
$user = $_POST['user'];
$pass = $_POST['pass'];

// Check If the username has update password
$udated = false; // not update

// I gues you always do this
$password = $updated ? md5($pass) : sha1($pass);

// Do the autentication
// Slect from Database
// Check the data
// Set auth
$auth = true;

// Then chage the password
if ($auth == true && !$updated) {
    $newpassword = sha1($pass);
    // Connect to DB
    // Update the Password
    // Set Status to Updated in DB
    $udated = true;
}

// Better Approch
if ($auth == true && !$updated) {
    $newpassword = password_hash($password, PASSWORD_BCRYPT);
    // Connect to DB
    // Update the Password
    // Set Status to Updated in DB
    $updated = true;
}

我使用password_hash 有更好的方法,因为它使用BCRYPT,这是一种更好的哈希算法。 See more information on password_compat

【讨论】:

    【解决方案2】:

    您可以在密码表中构建第二个 SHA1 字段,当用户登录时,它可以检查 md5 哈希(如果还没有 sha1 哈希),如果正确,将其重新哈希到 sha1 并存储。一旦所有用户都更改为 SHA1,您就可以删除您的 md5 字段。 --你对 MD5 哈希值加盐了吗?

    【讨论】:

      【解决方案3】:

      对不起,你不能。

      最好的办法是存储 MD5 和 SHA1 版本,并在用户登录时填充 SHA1 内容。只需检查 SHA1 版本是否可用,如果不使用旧的验证策略。

      最终,您应该透明地将大多数用户迁移到基于 SHA1/SALT 的新系统。

      【讨论】:

        【解决方案4】:

        您需要原始明文密码来创建它们的 SHA1 版本。但是,MD5 散列当然是一种方法。因此,除非您碰巧拥有密码的明文版本,否则无法做您想做的事情。

        【讨论】:

          【解决方案5】:

          除非用户重新输入密码,否则您无法更改哈希类型。它们是不可逆的单向哈希。我猜你可以尝试在彩虹表中进行查找,但由于某些哈希有多次冲突,所以这也不会在 100% 的情况下起作用。此外,您的盐会使这种效果无效。这就是吃盐的意义所在。

          【讨论】:

            猜你喜欢
            • 2013-06-17
            • 1970-01-01
            • 1970-01-01
            • 2014-02-07
            • 2013-03-15
            • 2011-08-16
            • 2020-09-16
            • 2014-07-13
            • 1970-01-01
            相关资源
            最近更新 更多