// 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;
}
5条答案
按热度按时间ia2d9nvy1#
您无法将
md5
转换为sha
,但实际上您的用户只在登录时使用密码,因此您可以稍微修改脚本以自动执行更新我使用
password_hash
作为更好的方法,因为它使用Bcrypt,这是一个更好的哈希算法。kuarbcqp2#
对不起,你不能。
您所能期望的最佳结果是同时存储MD5和SHA1版本,并在用户登录时填充SHA1内容。只需检查SHA1版本是否可用,如果不可用,则使用旧的验证策略。
最终,您应该透明地将大多数用户迁移到新的基于SHA1/SALT的系统。
jv4diomz3#
如果用户不重新输入密码,你就不能改变哈希类型。它们是不可逆的单向哈希。我想,你可以尝试在彩虹表中查找,但由于某些哈希有多次冲突,这也不是100%有效的。而且,你的盐会使它无效。这就是有盐的意义所在。
k2arahey4#
你需要原始的明文密码来创建SHA1版本的密码,但是MD5散列法当然是一种方法,所以除非你碰巧有明文版本的密码,否则你就没有办法做你想做的事情。
guz6ccqo5#
你可以在你的密码表中建立第二个SHA1字段,当用户登录时,它可以检查md5散列(如果还没有sha1散列),如果它是正确的,重新散列到sha1并存储它。一旦所有的用户都切换到SHA1,你可以删除你的md5字段。