尽管注册时使用了相同的哈希方法,但我的登录密码并不匹配



嗨,我厌倦了做和调试这个任务。我在Stackloverflow.com上读到了几个类似的问题,但找不到解决方案。问题是,尽管注册和登录都使用相同的哈希方法(假设md5,hash(,但每次我尝试登录时,都会显示不匹配的密码。

我使用的是"InsertUsers"类,其中有一个名为"userLogin"的方法,我从"login.php"文件向其发送两个参数(userName和userPassword(。在作为参数发送之前,我对密码进行了加密。但上面写着不匹配的密码。

当我在散列后检查login.php发送的密码时,我发现了这个字符串$2y$10$/syQEE.LiMBynyanGXmeei1lk/fgZrQ/K4V6PBpjsc3nlBMh6gd6而不是存储的字符串(通过注册页面存储($2y$10$1vrJ3Sq19uGjkIG9YG4NmOF。

除了不匹配的问题外,每次我输入相同的密码时,登录页面的哈希密码都会略有不同。下面是我使用的代码。请帮我找出这个问题。我在Stackoverflow中研究了几个问题,但没有一个与我的问题相匹配。

在registration.php中,我像这样加密-

$user_pass = password_hash($_POST['password'], PASSWORD_DEFAULT);

在我的userLogin方法中的InsertUsers类中是

public function userLogin($userName, $userPassword){
try{
$sql = "SELECT id FROM users WHERE user_name = ? AND password = ?";
$stmt = $this->connect()->prepare($sql);
$stmt->bindParam(1, $userName,PDO::PARAM_STR);
$stmt->bindParam(2, $userPassword,PDO::PARAM_STR);
$stmt->execute();
if($stmt->rowCount() > 0){
$result = $stmt->fetch(PDO::FETCH_ASSOC);
return $result['id'];
}
else{
return false;
}
}
catch (PDOException $e) {
echo 'Error, Please put correct data' .$e->getMessage();
}
}

在login.php文件中,我在将密码发送到上述方法之前对其进行了加密。

if((empty($_POST['username'])) || empty($_POST['password'])){
array_push($error_message, "User Name & Password required");
}
else{
$userName = $_POST['username'];
$userPassword = password_hash($_POST['password'], PASSWORD_DEFAULT);
}   

if(empty($error_message)){
$Login = new InsertUsers();
$loginCheck = $Login->userLogin($userName, $userPassword);
if($loginCheck > 0){
$_SESSION['username'] = $_POST['username'];
echo "Hello ". $_SESSION['username'];
}
else{
echo "password not matched";
}
}

password_hash()每次都不会返回相同的哈希,因此请使用password_verify()

public function userLogin($userName, $userPassword){
try{
$sql = "SELECT id FROM users WHERE user_name = ? AND password = ?";
$stmt = $this->connect()->prepare($sql);
$stmt->bindParam(1, $userName,PDO::PARAM_STR);
$stmt->bindParam(2, $userPassword,PDO::PARAM_STR);
$stmt->execute();
$result = $stmt->get_result();
while ($row = $result->fetch_assoc()) {
$hashed_password = $row['password'];
}
if($stmt->rowCount() > 0){
if (password_verify($userPassword, $hashed_password)) {
return $result['id'];
}
}
else{
return false;
}
}
catch (PDOException $e) {
echo 'Error, Please put correct data' .$e->getMessage();
}
}

此外,您应该将列的长度增加到255个字符。

最新更新