散列和盐没有正确比较

hashing and salt not comparing correctly

我已成功将加盐哈希值保存到数据库中。现在我面临的问题是如何设置它以比较它们以登录。我是否必须再次进行哈希处理?如果我再做一次,会不会有所不同?现在支票说它有效,但我无法在它被散列之前用密码签名。
下面的代码是我到目前为止尝试过的代码:

$con = mysqli_connect($DB_HOST,$DB_USER,$DB_PASSWORD,$DB_DATABASE);
if(!$con){
echo "Connection Error...".mysqli_connect_error();
}
else
{
//echo "Database connection Success...";
}

 $user_name =mysqli_real_escape_string($con, $_POST["login_name"]);  
 $user_pass =mysqli_real_escape_string($con, $_POST["login_pass"]);  
$cost = 10;
$salt = strtr(base64_encode(mcrypt_create_iv(16, MCRYPT_DEV_URANDOM)), '+',  '.');
$salt = sprintf("a$%02d$", $cost) . $salt;


 $sql_query = "select  user_name,user_pass from user_info where  
user_pass ='$user_pass' and user_name = '$user_name'";  


$hash = crypt($user_pass, $salt);
if(crypt($user_pass,$hash)==$hash){
echo "works"; 
 $result = mysqli_query($con,$sql_query);  
 if(mysqli_num_rows($result) >0 )  
 {  
 $row = mysqli_fetch_assoc($result);  
 $name = $row["name"];  
 echo "Login Success..Welcome " .$name;
 }  
 else  
 {   
 echo "Login Failed.......Try Again..";  

}
}

您的登录总是会失败,因为这个查询...

"select  user_name,user_pass from user_info where  
user_pass ='$user_pass' and user_name = '$user_name'"

...将用户输入的密码与存储的哈希密码进行比较。

更好的方法是:

  1. SELECT 记录登录用户名(忽略密码)
  2. 如果没有找到记录,则用户名不存在。失败
  3. 将该记录中的密码与提交的密码进行比较。
  4. 如果不匹配,则密码错误。失败。
  5. 登录成功。

当 PHP 本机提供散列时,您试图实现自己的散列,这让您的生活变得非常困难。在帐户注册时散列密码(假设用户选择 $clear_pwd):

$hash_pwd = password_hash($clear_pwd, PASSWORD_DEFAULT);

这会为您生成加密安全盐和散列。 $hash_pwd 存储在数据库中。现在在登录时,在上面的第 3 步(密码验证)中,执行:

if (password_verify($clear_pwd, $hash_pwd)){ 
    // $clear_pwd is correct
}else{
    // password is incorrect.
}

简单!