使用 password_hash 和 password_verify

10

在我的登录 PHP 文件中,我有以下内容

$passwordInput = password_hash($passInput, PASSWORD_BCRYPT);
$passwordVerify = password_verify($userInput, $passwordInput);

在我的注册PHP文件中有这样的代码。

$passwordSign = password_hash($passSign, PASSWORD_BCRYPT);

现在,基本上我让它在注册时哈希密码并将其插入数据库。确实如此。

但是,它无法验证。两个结果都给出了2个不同的哈希值,我不知道可能做错了什么。我还尝试只是让它再次哈希输入并检查数据库中的password_hash,但那行不通。

正确使用它们的方法是什么?

(此外,$passSign和$userInput是输入字段,并且确实获取了用户名/密码)


你确定变量名是正确的吗?特别是 $passInput$userInput - Hanky Panky
请不要在找到解决方案后删除原始问题的内容,而是将您的解决方案作为答案添加以帮助其他人。 - edigu
1个回答

16

在注册时,您将从用户输入中获取密码并使用password_hash()生成其哈希值:

$hash = password_hash($_POST['password'], PASSWORD_BCRYPT);

你可以在第三个参数中提供自定义salt,但是文档建议不要这样做:

注意 强烈建议您不要为此函数生成自己的salt。如果您不指定salt,它将为您自动创建一个安全的salt。

您将此哈希值保存在数据库中,请确保将其放入长度为60个字符或更长CHAR/VARCHAR字段中。

当用户想要登录时,您可以使用password_verify()函数检查他们输入的密码与先前保存的哈希值是否匹配:

$auth = password_verify($_POST['password'], $hash);

当然,你需要通过提供的用户名从数据库中搜索,以获取$hash的正确值。

如果$authTRUE,则提供的密码与注册时计算的哈希值匹配,用户已通过身份验证。


1
如果数据库中有'user_name'和'user_pass'字段,假设有数百个用户,每个用户都有唯一的'user_name'(在用户注册时进行了唯一性检查),那么您如何执行用户帐户的数据库查找?您不能通过'user_name'和'user_pass'的条件进行查找。您不能使用password_verify,因为您不知道要选择哪条记录(假设可能存在重复密码,但每个密码都有不同的'user_name')。所以,您必须查询'user_name',然后循环遍历1个或多个结果以检查password_verify吗?谢谢。 - Rick Hellewell
1
你在第二句话中说:“假设有数百个用户,每个用户都有唯一的'用户名'”。当你通过“用户名”搜索时,要么在数据库中找到一个记录,要么就找不到。在数据库的“用户名”列上创建一个“唯一索引”,以帮助它运行更快并强制唯一性。 - axiac
3
文档建议将哈希值存储在一个长度为255的varchar字段中,因为算法可能在未来的PHP版本中更改而没有通知。 - andreszs

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接