【问题标题】:Using password_hash and password_verify [duplicate]使用 password_hash 和 password_verify [重复]
【发布时间】:2015-05-10 06:18:47
【问题描述】:

在我的登录 PHP 文件中,我有这些

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

在我的注册 PHP 文件中我有这个。

$passwordSign = password_hash($passSign, PASSWORD_BCRYPT);

现在,基本上我做了它,所以它会散列密码并在注册时将自己插入数据库。它的作用。

但是,它无法验证它。两个结果都给出了 2 个不同的哈希值,我不知道我可能做错了什么。我还尝试让它再次对输入进行哈希处理并检查数据库中的密码哈希,但这没有用..

使用这些的正确方法是什么?

(另外,$passSign 和 $userInput 是输入字段,它确实获取用户名/密码)

【问题讨论】:

  • 你确定变量名是正确的吗?特别是$passInput$userInput ?
  • 找到解决方案后,不要删除原始问题的正文,而是将您的解决方案添加为帮助他人的答案。

标签: php


【解决方案1】:

注册时,您从用户输入中获取密码并使用password_hash() 生成密码:

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

您可以在第三个参数中为其提供要使用的自定义盐,但文档 recommends 不这样做:

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

您将此哈希保存在数据库中。确保将其放入CHAR/VARCHAR60 个字符或更长的字段

当用户想要登录时,请检查他们输入的密码与之前使用 password_verify() 保存的哈希值:

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

当然,您可以从数据库中通过提供的用户名搜索得到正确的 $hash 值。

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

【讨论】:

  • 假设您在数据库中有字段“user_name”和“user_pass”,您将如何执行用户帐户的数据库查找。假设有数百个用户,具有唯一的“用户名”(唯一检查在用户注册期间)。您不能通过 user_name 和 user_pass 的条件进行查找。您不能使用 password_verify,因为您不知道要选择的正确记录(假设可能有重复的密码,但每个密码都有不同的用户名)。那么您是否必须查询 user_name,然后遍历 1+ 个结果以检查 password_verify?谢谢。
  • 您在第二句话中说:“假设有数百个用户,具有唯一的'user_name'”。当您按“用户名”搜索时,您要么在数据库中找到一条记录,要么没有找到任何记录。在数据库中的“用户名”列上创建一个UNIQUE INDEX,以帮助它快速运行并强制执行唯一性。
  • 文档建议将哈希存储在 255 长度的 varchar 字段中,因为该算法可能会在未来的 PHP 版本中更改,恕不另行通知。
猜你喜欢
  • 2016-04-13
  • 1970-01-01
  • 1970-01-01
  • 2022-07-02
  • 2013-02-06
  • 1970-01-01
  • 2020-01-21
  • 1970-01-01
相关资源
最近更新 更多