我有一个严重的问题,我整天都在寻找答案,但我找不到任何东西......
我在做什么:
我正在尝试让用户登录我的网站(在 php 中)。
密码和用户保存在我服务器上的 MySQL 数据库中。
对于我使用的密码Bcrypt。唯一的问题是我没有更改Bcrypt代码的知识。我从一个免费的网站上得到了课程。
问题
现在的问题是,当我对密码进行哈希处理时$
,前面有三个标志。
例如:loltest
将成为$2y$10$wxadWEbkn..XpJ.C1TmnaeOyneJyQbcAIJ20yBBlBoBr1XDwDkJSq
散列密码存储在我的数据库中的一个表中。
第1步
用户登录输入他/她的密码,php 代码然后验证密码是否与散列密码匹配。用户名是$phpro_username
,密码存储在$phpro_password
.
但在调用该函数之前,我从表中选择散列密码,如下所示:
$dbh = new PDO("mysql:host=$mysql_hostname;dbname=$mysql_dbname", $mysql_username, $mysql_password);
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$stmt = $dbh->prepare("SELECT phpro_password FROM phpro_users WHERE phpro_username = '$phpro_username'");
$stmt->execute();
$hash = $stmt->fetchColumn();
第2步
我尝试使用名为 的函数password_verify
,它看起来像这样:
function password_verify($password, $hash) {
if (!function_exists('crypt')) {
trigger_error("Crypt must be loaded for password_verify to function", E_USER_WARNING);
return false;
}
$ret = crypt($password, $hash);
if (!is_string($ret) || strlen($ret) != strlen($hash) || strlen($ret) <= 13) {
return false;
}
$status = 0;
for ($i = 0; $i < strlen($ret); $i++) {
$status |= (ord($ret[$i]) ^ ord($hash[$i]));
}
return $status === 0;
}
我该怎么做?
$check = password_verify($phpro_password, $hash);
如果密码匹配$check
将为 1,否则将为空。
通常这应该可以工作,但是当我运行这段代码时,$check
它总是空的。如果我尝试在没有 MySQL 的情况下执行此操作,则没有问题:
<?php
include 'password.php';
$password = "loltest";
$hash = password_hash($password, PASSWORD_BCRYPT);
$verify = password_verify("loltest", $hash);
echo $verify;
?>
例如,如果我运行上面的代码,$verify
则始终为 1。
经过一番研究:
我认为问题出在 MySQL 上,因为在我的哈希中是三个$
符号,如果我将它存储在 MySQL 中然后将其取出,则变量会随着它们的值而改变,在这种情况下什么都没有,并且密码不匹配。
有没有办法解决这个问题?或者有没有办法替换$
我的哈希中的符号?