Can';无法让PHP密码\u哈希api正常工作

Can';无法让PHP密码\u哈希api正常工作,php,security,hash,Php,Security,Hash,所以我对字符串“test”进行了哈希运算 保存在我的密码字段(varchar 255) 然后我做了一个简单的测试登录页面 if (!empty($_POST['username']) && !empty($_POST['password'])) { $username = trim($_POST['username']); $password = trim($_POST['password']); $stmt = $db->prepare("SELECT usernam

所以我对字符串“test”进行了哈希运算

保存在我的密码字段(varchar 255)

然后我做了一个简单的测试登录页面

if (!empty($_POST['username']) && !empty($_POST['password']))
{

$username = trim($_POST['username']);
$password = trim($_POST['password']);

$stmt = $db->prepare("SELECT username, password FROM users WHERE username = ? AND password = ?");
$stmt->execute(array($username, $password));
$row = $stmt->fetch();
$hash = $row['password'];

if (password_verify($password, $hash)) {
//success
} else {
 //wrong credentials
}
然后我输入我的用户名和密码
test
,但当它应该返回true时,它返回false(但显然我错了,因为它没有,我在这里遗漏了一些东西)

我做错了什么

我读了很多关于它的书,但我不明白为什么它不会变成真的。请注意,我是个新手


我猜,为什么散列中开头的前6个字符总是一样的<代码>$2y$10。那不太好。

我猜您正在数据库中存储哈希密码

在where子句中,需要传递散列密码,而不是纯文本

$stmt->execute(数组($username,password\u散列($password))


在if语句中,同样的事情是,确保两者都是散列的

当该列包含散列时,您的文本输入
$password
在SELECT查询中将不匹配。我刚刚意识到这一点stupid@Smugglaren不,你不是,发生在我们最好的人身上!这是错误的方法。每次调用
password\u hash()
都会得到一个不同的咸散列。它永远不会匹配数据库内容。@mario我不是php的母语,所以我不知道确切的函数,但至少他了解问题的根源。是的,这是不正确的,但我现在可以工作了
if (!empty($_POST['username']) && !empty($_POST['password']))
{

$username = trim($_POST['username']);
$password = trim($_POST['password']);

$stmt = $db->prepare("SELECT username, password FROM users WHERE username = ? AND password = ?");
$stmt->execute(array($username, $password));
$row = $stmt->fetch();
$hash = $row['password'];

if (password_verify($password, $hash)) {
//success
} else {
 //wrong credentials
}