我已成功将盐渍哈希保存到数据库中。现在我遇到的问题就是如何设置它们来比较它们之间的登录。我是否必须再次制作哈希?如果我确实再次使它赢了,那会有所不同吗?现在检查说它有效但我在密码被哈希之前无法用密码签名 下面的代码是我到目前为止所尝试的:
$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..";
}
}
答案 0 :(得分:2)
您的登录将始终失败,因为此查询...
"select user_name,user_pass from user_info where
user_pass ='$user_pass' and user_name = '$user_name'"
...将用户输入的密码与散列存储的密码进行比较。
更好的方法是:
SELECT
记录登录用户名(忽略密码)当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.
}
简单!