我知道password_verify可用于检查密码对预先存储的哈希的有效性。我也知道password_hash要求我们选择哈希算法,例如PASSWORD_ACTUAL
或PASSWORD_BCRYPT
。
当password_verify($pass, $hash)
将$pass
转换为哈希时,它将如何知道要使用哪种算法?
答案 0 :(得分:5)
它可以告诉因为哈希本身具有所需的信息。
根据PHP文档:
请注意,password_hash()返回算法,cost和salt作为返回哈希的一部分。因此,验证散列所需的所有信息都包含在其中。这允许验证函数验证散列,而无需为salt或算法信息单独存储。
例如,PASSWORD_BCRYPT
哈希看起来像这样:
$2a$10$N9qo8uLOickgx2ZMRZoMyeIjZAgcfl7p92ldGxad68LJZdL17lhWy
|-----|----------------------|------------------------------|
A1,A2 B C
2a
表示哈希算法。对于Bcrypt来说,它是2a
,2b
或2y
10
是哈希的费用参数。这使得散列可以安全地防止定时攻击,因为你可以增加这个数量来增加" work"它需要计算使用所有这些参数(暂时只看a1
),它已经可以告诉它是什么算法。
答案 1 :(得分:0)
使用PASSWORD_BCRYPT创建的哈希在开头有一个标识符:$ 2y $并且还确保哈希的长度为60个字符。 password_verify()最有可能查看其中一个或两个,以确定要使用的哈希类型。