php中的password_verify和password_hash

时间:2017-09-07 16:42:46

标签: php passwords

我知道password_verify可用于检查密码对预先存储的哈希的有效性。我也知道password_hash要求我们选择哈希算法,例如PASSWORD_ACTUALPASSWORD_BCRYPT

password_verify($pass, $hash)$pass转换为哈希时,它将如何知道要使用哪种算法?

2 个答案:

答案 0 :(得分:5)

它可以告诉因为哈希本身具有所需的信息。

根据PHP文档:

  

请注意,password_hash()返回算法,cost和salt作为返回哈希的一部分。因此,验证散列所需的所有信息都包含在其中。这允许验证函数验证散列,而无需为salt或算法信息单独存储。

Reference

例如,PASSWORD_BCRYPT哈希看起来像这样:

$2a$10$N9qo8uLOickgx2ZMRZoMyeIjZAgcfl7p92ldGxad68LJZdL17lhWy
|-----|----------------------|------------------------------|
 A1,A2           B                            C
  • A1:2a表示哈希算法。对于Bcrypt来说,它是2a2b2y
  • A2:10是哈希的费用参数。这使得散列可以安全地防止定时攻击,因为你可以增加这个数量来增加" work"它需要计算
  • B:这是128位盐
  • C:生成的184位哈希

使用所有这些参数(暂时只看a1),它已经可以告诉它是什么算法。

答案 1 :(得分:0)

使用PASSWORD_BCRYPT创建的哈希在开头有一个标识符:$ 2y $并且还确保哈希的长度为60个字符。 password_verify()最有可能查看其中一个或两个,以确定要使用的哈希类型。