PHP password_hash 和 password_verify 不适用于 MySQL
PHP password_hash and password_verify Not Working with MySQL
我正在使用 password_hash
将密码存储在 VARCHAR(255) 类型的 MySQL 数据库字段中。当我尝试登录用户并验证凭据时,password_verify
函数总是 returns false。
这是将密码存储在 MySQL 数据库中的代码摘录:
$password_hash = password_hash($password, PASSWORD_DEFAULT);
// Generate API Key
$api_key = $this->generateApiKey();
// Insert Query
$stmt = $this->conn->prepare("INSERT INTO user(email, password, name, api_key, status) values(?, ?, ?, ?, 1)");
$stmt->bind_param("ssss", $email, $password_hash, $name, $api_key);
$result = $stmt->execute();
$stmt->close();
以及检查密码的代码:
// Query user by email
$stmt = $this->conn->prepare("SELECT password FROM user WHERE email = ?");
$stmt->bind_param("s", $email);
$stmt->execute();
$stmt->bind_result($password_hash);
$stmt->store_result();
if ($stmt->num_rows > 0) {
// Found user with that email address
// Now verify the password
$stmt->fetch();
$stmt->close();
if (password_verify($password, $password_hash)) {
// User password is correct
return TRUE;
然后我写了这个测试代码,直接从MySQL字段中抓取数据,还是失败了。当我在同一个文件中创建 password_hash(下面文件中的 $hash2)时 - 然后密码验证正确。
$password = 'pass1234567890';
$hash = 'y$JLP/pPei6RYRdUmoH8H5RO7iJyImOtrBLsrRRfq3XpeqNE3lQ/l7O';
$hash2 = password_hash($password, PASSWORD_DEFAULT);
echo $hash . " - " . strlen($hash);
echo "<br />";
echo $hash2 . " - " . strlen($hash2);
echo "<br />";
if (password_verify($password, $hash)) {
echo "Password Valid!";
} else {
echo "Password invalid!";
}
echo "<br /><br />";
if (password_verify($password, $hash2)) {
echo "Password 2 Valid!";
} else {
echo "Password 2 invalid!";
}
这证明你的散列有问题
<?php
// See the password_hash() example to see where this came from.
$password = 'pass1234567890';
$hash = 'y$JLP/pPei6RYRdUmoH8H5RO7iJyImOtrBLsrRRfq3XpeqNE3lQ/l7O';
$hash2 = 'y$gMJKYZUc1FKSZBnsONxLOebOHj.uuEWSiCP0jo4Zv0iAHBz6iz.NG';
if (password_verify('pass1234567890', $hash)) {
echo 'Password is valid!';
} else {
echo 'Invalid password.';
}
echo "<br>";
if (password_verify('pass1234567890', $hash2)) {
echo 'Password is valid!';
} else {
echo 'Invalid password.';
}
截图
只需为 if(password_verify($pass_input, $pass_db))
创建一个变量
其中 $pass_input
是文本形式给出的值,$pass_db
是存储在 mysql 中的值(散列)
像这样:
$verif_pass = (password_verify($pass_input, $pass_db));
if($verif_pass){echo "TRUE"} else {echo "FALSE";}
然后根据需要修改 TRUE/FALSE。
在我的例子中,问题是我将数据库连接查询存储在另一个文件中,该文件包含我用于获取当前密码的相同变量,所以发生的事情是首先我为当前密码分配了一个变量“密码”然后包含我的连接查询文件,该文件具有相同的变量“密码”,因此发生的事情是,注册表单的“密码”变量被连接查询的“密码”变量重新分配,这就是它实际上散列另一个密码的原因。所以通过更改变量名这个问题就解决了。
这是我的代码供参考,
signup.php
$email = $_POST["email"];
$password = $_POST["password"];
include 'partials/php/_dbconnect.php';
$passwordHash = password_hash($passwd, PASSWORD_DEFAULT);
_dbconnect.php
<?php
$server = "localhost";
$username = "root";
$password = "";
$database = "demo";
$connectionquery = mysqli_connect($server, $username, $password, $database);
?>
我改成的;
$email = $_POST["email"];
$passwd = $_POST["password"];
include 'partials/php/_dbconnect.php';
$passwordHash = password_hash($passwd, PASSWORD_DEFAULT);
password_verify($password,trim($password_hash)))
虽然我不确定它是在存储哈希时还是在检索期间发生的,但 password_hash 最后有一个 space。在将其提供给 password_verify 之前修剪哈希对我来说解决了这个问题。
我正在使用 password_hash
将密码存储在 VARCHAR(255) 类型的 MySQL 数据库字段中。当我尝试登录用户并验证凭据时,password_verify
函数总是 returns false。
这是将密码存储在 MySQL 数据库中的代码摘录:
$password_hash = password_hash($password, PASSWORD_DEFAULT);
// Generate API Key
$api_key = $this->generateApiKey();
// Insert Query
$stmt = $this->conn->prepare("INSERT INTO user(email, password, name, api_key, status) values(?, ?, ?, ?, 1)");
$stmt->bind_param("ssss", $email, $password_hash, $name, $api_key);
$result = $stmt->execute();
$stmt->close();
以及检查密码的代码:
// Query user by email
$stmt = $this->conn->prepare("SELECT password FROM user WHERE email = ?");
$stmt->bind_param("s", $email);
$stmt->execute();
$stmt->bind_result($password_hash);
$stmt->store_result();
if ($stmt->num_rows > 0) {
// Found user with that email address
// Now verify the password
$stmt->fetch();
$stmt->close();
if (password_verify($password, $password_hash)) {
// User password is correct
return TRUE;
然后我写了这个测试代码,直接从MySQL字段中抓取数据,还是失败了。当我在同一个文件中创建 password_hash(下面文件中的 $hash2)时 - 然后密码验证正确。
$password = 'pass1234567890';
$hash = 'y$JLP/pPei6RYRdUmoH8H5RO7iJyImOtrBLsrRRfq3XpeqNE3lQ/l7O';
$hash2 = password_hash($password, PASSWORD_DEFAULT);
echo $hash . " - " . strlen($hash);
echo "<br />";
echo $hash2 . " - " . strlen($hash2);
echo "<br />";
if (password_verify($password, $hash)) {
echo "Password Valid!";
} else {
echo "Password invalid!";
}
echo "<br /><br />";
if (password_verify($password, $hash2)) {
echo "Password 2 Valid!";
} else {
echo "Password 2 invalid!";
}
这证明你的散列有问题
<?php
// See the password_hash() example to see where this came from.
$password = 'pass1234567890';
$hash = 'y$JLP/pPei6RYRdUmoH8H5RO7iJyImOtrBLsrRRfq3XpeqNE3lQ/l7O';
$hash2 = 'y$gMJKYZUc1FKSZBnsONxLOebOHj.uuEWSiCP0jo4Zv0iAHBz6iz.NG';
if (password_verify('pass1234567890', $hash)) {
echo 'Password is valid!';
} else {
echo 'Invalid password.';
}
echo "<br>";
if (password_verify('pass1234567890', $hash2)) {
echo 'Password is valid!';
} else {
echo 'Invalid password.';
}
截图
只需为 if(password_verify($pass_input, $pass_db))
创建一个变量
其中 $pass_input
是文本形式给出的值,$pass_db
是存储在 mysql 中的值(散列)
像这样:
$verif_pass = (password_verify($pass_input, $pass_db));
if($verif_pass){echo "TRUE"} else {echo "FALSE";}
然后根据需要修改 TRUE/FALSE。
在我的例子中,问题是我将数据库连接查询存储在另一个文件中,该文件包含我用于获取当前密码的相同变量,所以发生的事情是首先我为当前密码分配了一个变量“密码”然后包含我的连接查询文件,该文件具有相同的变量“密码”,因此发生的事情是,注册表单的“密码”变量被连接查询的“密码”变量重新分配,这就是它实际上散列另一个密码的原因。所以通过更改变量名这个问题就解决了。
这是我的代码供参考,
signup.php
$email = $_POST["email"];
$password = $_POST["password"];
include 'partials/php/_dbconnect.php';
$passwordHash = password_hash($passwd, PASSWORD_DEFAULT);
_dbconnect.php
<?php
$server = "localhost";
$username = "root";
$password = "";
$database = "demo";
$connectionquery = mysqli_connect($server, $username, $password, $database);
?>
我改成的;
$email = $_POST["email"];
$passwd = $_POST["password"];
include 'partials/php/_dbconnect.php';
$passwordHash = password_hash($passwd, PASSWORD_DEFAULT);
password_verify($password,trim($password_hash)))
虽然我不确定它是在存储哈希时还是在检索期间发生的,但 password_hash 最后有一个 space。在将其提供给 password_verify 之前修剪哈希对我来说解决了这个问题。