password_hash似乎返回一个随机变量

Ian*_*use 3 php mysql database passwords bcrypt

我在将密码存储在用户数据库中之前尝试对密码进行哈希处理,因此我运行代码:

$hashedPass = password_hash($pass, PASSWORD_DEFAULT);
Run Code Online (Sandbox Code Playgroud)

这段代码给了我一个值,比如说$ 2y $ 10 $ wAJr0Z1spRtOcK4cLhIkguUCKgwZKYrwm.nRhm6AtCfDH8ri7ylJu存储在数据库中。现在,当我尝试登录时,作为密码输入的相同字符串给出了完全不同的$ hashedPass:说$ 2y $ 10 $ cayCQDSQ6pCICSozuIgBNu9uIopIoT5R6Y7aHXG6wx4v / oKx.Ipse

这只是随机的吗?有什么我应该代替的吗?

Mat*_*ley 5

这是预期的行为。password_hash生成盐,该盐与纯文本密码一起使用以生成哈希。盐是随机生成的,因此每次调用时输出都会不同password_hash

使用password_verify验证密码。

http://php.net/manual/zh/function.password-verify.php

password_verify散列本身包含验证纯文本密码所需的所有信息。哈希的解剖结构取决于您提供的密码哈希所使用的算法:

$2y$10$wAJr0Z1spRtOcK4cLhIkguUCKgwZKYrwm.nRhm6AtCfDH8ri7ylJu
Run Code Online (Sandbox Code Playgroud)
  • $ 2y $此前缀表示这是一个bcrypt哈希
  • 10这是成本参数
  • wAJr0Z1spRtOcK4cLhIkgu前22个字符为盐
  • UCKgwZKYrwm.nRhm6AtCfDH8ri7ylJu其余的31个字符是哈希

https://zh.wikipedia.org/wiki/Bcrypt

  • 注意完整性:随机盐加上一些其他数据作为哈希数据的前缀,以便“password_verify”可以生成相同的哈希值进行比较。 (2认同)