我正在尝试制作一个连接到我的服务器的登录页面,并检查存储的(散列,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。
试图找到将输入变量转换为散列版本以比较密码的函数,但到目前为止还没有奏效。我已经回显了密码变量,它们的值不相等。
您似乎使用了错误的功能来验证您的密码。
password_verify()
函数仅与 password_hash()
创建的哈希兼容,而不兼容 hash()
与 SHA256
创建的哈希。你有两种选择来解决这个问题:
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>';
}
}
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>';
}
}