我正在使用password_hash
功能,它在注册表单和登录表单中运行良好但在更改密码表单期间不起作用,它给我错误消息不正确的旧密码可能是我的代码出错或者可能是因为password_hash
每次都会生成不同的字符集,即使是相同的输入,如果是,那么使用什么方法来更新密码。相同的代码使用md5。
if(isset($_POST['senddata'])){
$old_password = $_POST['oldpassword'];
$new_password = $_POST['newpassword'];
$repeat_password = $_POST['newpassword2'];
$query = $db->prepare("SELECT * FROM users WHERE username=:username");
$query->execute(array(':username'=>$username));
$row = $query->fetch(PDO::FETCH_ASSOC);
$db_password=$row['password'];
// hash old password before match
$old_password = password_hash($old_password, PASSWORD_DEFAULT);
// check if old password equals db_password
if ($old_password==$db_password) {
// continue changing users password
if ($new_password==$repeat_password) {
// hash the new password
$new_password=password_hash($new_password, PASSWORD_DEFAULT);
$repeat_password=password_hash($repeat_password, PASSWORD_DEFAULT);
// update password
$password_update_query=$db->prepare("UPDATE userss SET password=:password, password2=:password2 WHERE username=:username");
$password_update_query->execute(array(':password'=>$new_password,':password2'=>$repeat_password2,':username'=>$username));
echo "Your Password Updated";
}
} else {
echo "Old password is incorrect";
}
}
答案 0 :(得分:1)
您需要使用password_verify($password, $hash);来验证密码是否相等
当你再次散列它时,你得到另一个结果,因为它生成一个新的盐,然后导致另一个散列。
类似的东西:
$old_password = $_POST['oldpassword'];
$db_password = $row['password']; // which should be already hashed
if (password_verify($old_password, $db_password) {