我有一个系统使用 MD5 对我的用户的密码进行哈希处理并将其存储到我的数据库中。现在,我将更改为使用 SHA1(和唯一系统 SALT,而不是用户唯一)的另一个系统来散列密码。
如何使用 PHP 将用户旧的 MD5 密码转换为我的新 SHA1 密码?
您无法转换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 的更多信息
对不起,你不能。
最好的办法是存储 MD5 和 SHA1 版本,并在用户登录时填充 SHA1 内容。只需检查 SHA1 版本是否可用,如果不使用旧的验证策略。
最终,您应该透明地将大多数用户迁移到基于 SHA1/SALT 的新系统。
您可以在密码表中构建第二个 SHA1 字段,当用户登录时,它可以检查 md5 散列(如果还没有 sha1 散列),如果正确,将其重新散列到 sha1 并存储。一旦所有用户都更改为 SHA1,您就可以删除您的 md5 字段。——你是否对 MD5 哈希值进行了加盐处理?
除非用户重新输入密码,否则您无法更改哈希类型。它们是不可逆的单向哈希。我猜你可以尝试在彩虹表中进行查找,但由于某些哈希有多次冲突,所以这也不会在 100% 的情况下起作用。此外,您的盐会使这种效果无效。这就是吃盐的意义所在。
您需要原始明文密码来创建它们的 SHA1 版本。但是,MD5 散列当然是一种方法。因此,除非您碰巧拥有密码的明文版本,否则无法做您想做的事。