3

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

如何使用 PHP 将用户旧的 MD5 密码转换为我的新 SHA1 密码?

4

5 回答 5

5

您无法转换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了更好的哈希算法。 查看有关 password_compat 的更多信息

于 2013-05-31T18:51:34.913 回答
4

对不起,你不能。

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

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

于 2013-05-31T18:46:19.500 回答
1

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

于 2013-05-31T18:49:11.480 回答
1

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

于 2013-05-31T18:46:06.990 回答
1

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

于 2013-05-31T18:46:18.250 回答