【问题标题】:hash password and verify it with same variable [duplicate]哈希密码并使用相同的变量进行验证[重复]
【发布时间】:2017-03-06 23:51:18
【问题描述】:

我尝试创建更安全的注册页面然后我添加此代码作为密码

$pas_usr = mysqli_real_escape_string($koneksi, $_POST['pas_usr']);
$pas_usr = password_hash($pas_usr, PASSWORD_BCRYPT);

结果是密码列被加密

然后在登录页面,当我尝试验证它时,它说密码错误

这是我的登录页面:

//memulai session baru
session_start();

//memanggil koneksi
include "koneksi.php";

$username = $_POST['username'];
$password = $_POST['password'];
$username = stripslashes($username);  
$password = stripslashes($password);  
$username = mysqli_real_escape_string($koneksi, $username);  
$password = mysqli_real_escape_string($koneksi, $password);  
$hashquery = mysqli_fetch_assoc(mysqli_query($koneksi, "SELECT * FROM `user` WHERE log_usr = '$username'"));
$hash=$hashquery['hash'];

if(password_verify($password, $hash)){

$query = mysqli_query($koneksi, "SELECT * from user WHERE log_usr='$username'");
$exitCount=mysqli_num_rows($query);
    if($exitCount==1){
            $data = mysqli_fetch_array($query);
            $id = $data["log_usr"];
            $lvl = $data["sts_usr"];

            if ($lvl=='A')
            {
                $link = 'index.html';
            }
            elseif($lvl='U')
            {
                $link = 'index.php';
            }
        $_SESSION['username'] = $username;
        header ("location:$link");
        exit();
    }else{
        echo "<script>alert('Username dan Password tidak valid.'); window.location = 'index.php'</script>";
    }
}else{
    echo "<script>alert('Username dan Password tidak valid.'); window.location = 'index.php'</script>";
}

【问题讨论】:

  • 你的 password_verify() 方法在哪里?也请出示上面写的代码..
  • @PHPGeek password_verify 是一个 PHP 函数
  • 您希望用户输入散列密码吗?因为您将来自$_POST['password'] 的用户输入放入$hash
  • @Memor-X 所以我需要在数据库中分别输入哈希和普通密码?

标签: php hash passwords


【解决方案1】:

password_verify 将您的纯密码与您给定密码的哈希版本相匹配,同时您在两个参数中都使用纯密码进行检查。 password_verify 是这样工作的:

password_verify($plainPassword, $hashedPassword)

<?php
// See the password_hash() example to see where this came from.
$hash = '$2y$07$BCryptRequires22Chrcte/VlQH0piJtjXl.0t1XkA8pw9dMXTpOq';

if (password_verify('rasmuslerdorf', $hash)) {
    echo 'Password is valid!';
} else {
    echo 'Invalid password.';
}
?>

【讨论】:

  • 所以在数据库中我们有明文密码和散列密码的列​​?
  • 我的意思是哈希密码也必须存储在数据库中对吗?
  • 实际上在数据库中您只需要保存密码的哈希版本,并且在检查时您应该检查用户提交的纯密码与使用password_verify 保存的哈希值。最佳做法是永远不要在数据库中保存纯密码。
  • 哦,我明白了,所以只有当用户在用户登录时提交它时才需要纯密码,然后程序将它与已经存储在数据库中的 hash 进行比较,并使用 password_verify 函数?所以我不需要在数据库中存储普通密码吗?
  • 没错!编码愉快!
猜你喜欢
  • 1970-01-01
  • 2016-05-12
  • 2016-06-06
  • 2015-12-17
  • 1970-01-01
  • 2016-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多