散列和盐没有正确比较

时间:2016-08-15 18:11:19

标签: php hash mcrypt

我已成功将盐渍哈希保存到数据库中。现在我遇到的问题就是如何设置它们来比较它们之间的登录。我是否必须再次制作哈希?如果我确实再次使它赢了,那会有所不同吗?现在检查说它有效但我在密码被哈希之前无法用密码签名  下面的代码是我到目前为止所尝试的:

$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("$2a$%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..";  

}
}

1 个答案:

答案 0 :(得分:2)

您的登录将始终失败,因为此查询...

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

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

更好的方法是:

  1. SELECT记录登录用户名(忽略密码)
  2. 如果未找到记录,则用户名不存在。失败
  3. 将该记录中的密码与提交的密码进行比较。
  4. 如果不匹配,则密码错误。失败。
  5. 登录成功。
  6. 当PHP本身提供此功能时,尝试实现自己的哈希,这会让您的生活变得非常困难。在帐户注册时哈希密码(假设用户选择$clear_pwd):

    $hash_pwd = password_hash($clear_pwd, PASSWORD_DEFAULT);
    

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

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

    简单!