散列和盐没有正确比较
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'"
...将用户输入的密码与存储的哈希密码进行比较。
更好的方法是:
SELECT
记录登录用户名(忽略密码)
- 如果没有找到记录,则用户名不存在。失败
- 将该记录中的密码与提交的密码进行比较。
- 如果不匹配,则密码错误。失败。
- 登录成功。
当 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.
}
简单!
我已成功将加盐哈希值保存到数据库中。现在我面临的问题是如何设置它以比较它们以登录。我是否必须再次进行哈希处理?如果我再做一次,会不会有所不同?现在支票说它有效,但我无法在它被散列之前用密码签名。
下面的代码是我到目前为止尝试过的代码:
$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'"
...将用户输入的密码与存储的哈希密码进行比较。
更好的方法是:
SELECT
记录登录用户名(忽略密码)- 如果没有找到记录,则用户名不存在。失败
- 将该记录中的密码与提交的密码进行比较。
- 如果不匹配,则密码错误。失败。
- 登录成功。
当 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.
}
简单!