登录页面上的 PHP 哈希密码

问题描述 投票:0回答:1

我正在尝试制作一个连接到我的服务器的登录页面,并检查存储的(散列,SHA256)数据库密码是否与登录页面上输入的密码相同。但是我还没有设法让它工作。

我的散列密码是在这个查询中创建的,例如:

"INSERT INTO accounts VALUES (0,0,'secure',1500434821,0,1,'testaccount',SHA2('testaccount:password', 256),'[email protected]',CAST(N'2023-03-12 10:34:09' AS DateTime),NULL,NULL,NULL);"

但是对于我目前的登录页面,我有:

$password = trim($_POST["password"]);

mysqli_stmt_bind_result($stmt, $id, $username, $hashed_password);
if(mysqli_stmt_fetch($stmt)){
    if(password_verify($password, $hashed_password)) {
        echo 'login succes' .'<br>';
    } else {
        echo 'login fail' .'<br>';
    }
}

$password
是登录页面输入,
$hashed_password
是保存存储在数据库中的密码的变量。当我将它们放在 if 语句中时,它不起作用。保存在数据库中的密码是 SHA-256。

试图找到将输入变量转换为散列版本以比较密码的函数,但到目前为止还没有奏效。我已经回显了密码变量,它们的值不相等。

php sql database authentication hash
1个回答
1
投票

您似乎使用了错误的功能来验证您的密码。

password_verify()
函数仅与
password_hash()
创建的哈希兼容,而不兼容
hash()
SHA256
创建的哈希。你有两种选择来解决这个问题:

  1. 您可以使用
    password_hash()
    PASSWORD_DEFAULT
    算法来创建您的哈希值,然后使用
    password_verify()
    来检查它们。这是推荐的方法,因为它使用安全且最新的算法自动处理加盐和拉伸。例如:
// Register.php
$password = trim($_POST["password"]);
$hashed_password = password_hash($password, PASSWORD_DEFAULT);
// Insert $hashed_password into database

// Login.php
$password = trim($_POST["password"]);
mysqli_stmt_bind_result($stmt, $id, $username, $hashed_password);
if(mysqli_stmt_fetch($stmt)){
    if(password_verify($password, $hashed_password)) {
        echo 'login success' .'<br>';
    } else {
        echo 'login fail' .'<br>';
    }
}
  1. 您可以使用
    hash()
    SHA256
    和盐来创建您的散列,然后使用
    hash_equals()
    来检查它们。这不太安全且更容易出错,因为您必须手动处理加盐和拉伸。例如:
// Register.php
$password = trim($_POST["password"]);
$salt = createSalt(); // Your function to generate a random salt
$hashed_password = hash('sha256', $salt . $password);
// Insert $hashed_password and $salt into database

// Login.php
$password = trim($_POST["password"]);
mysqli_stmt_bind_result($stmt, $id, $username, $hashed_password, $salt);
if(mysqli_stmt_fetch($stmt)){
    if(hash_equals($hashed_password, hash('sha256', $salt . $password))) {
        echo 'login success' .'<br>';
    } else {
        echo 'login fail' .'<br>';
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.