更改密码哈希类型(md5到sha1)的最有效方法


Most efficient way to change the hash type of a password (md5 to sha1)

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

我如何设法让用户旧的MD5密码变成我的新SHA1密码与PHP?

您不能将md5转换为sha,但实际上您的用户只在即将登录时使用密码,因此您可以稍微修改您的脚本以自动更新

// 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

的更多信息

对不起,你不能。

您所希望的最好情况是同时存储MD5和SHA1版本,并在用户登录时填充SHA1内容。只要检查一下SHA1版本是否可用,如果没有,使用旧的验证策略。

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

如果用户不重新输入密码,则无法更改哈希类型。它们是不可逆的单向哈希。你可以,我猜,尝试在彩虹表中进行查找,但由于某些哈希有多次碰撞,这也不会100%有效。而且,你的盐会让它失效。这就是盐的意义。

您需要原始的明文密码来创建它们的SHA1版本。然而,MD5哈希当然是一种方法。所以,除非你碰巧有密码的明文版本,否则你无法做你想做的事情。

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