password_hash输出的格式是什么


What is the format of password_hash output?

我知道PHP函数,password_hash在一个字符串中输出算法、成本、salt和哈希,这样password_verify就可以检查密码了。

PHP页面的示例输出:

$2y$10$.vGA1O9wmRjrwAVXD98HNOgsNpDczlqm3Jq7KnEd1rVAGv3Fykk1a

因此2y$表示算法,10代表成本。但是password_verify是如何将盐从散列中分离出来的呢?之后,我没有看到任何标识符将两者分开。

用于密码哈希的bCrypt版本。Bcrypt具有固定长度的salt值。当您使用password_hash()/password_verify()和默认算法时,PHP内部调用的crypt函数有一个16字节的salt。这是作为自定义base64字母表A-Za-z/.的22个字符给出的,然后它将字符串解码为字节,因为22个B64字符编码16.5字节,有一个额外的半字节数据没有被考虑在内。

对于所有其他散列,salt值是一组定义的字节,这些字节当然被编码到ASCII安全b64中,并放在$符号之后,然后验证函数只需要通过分隔符$将字符串拆分为多个部分,然后再查找第三组字符,得到substr(0,B64_ENCODED_HASH_ALGORITHM_SALT_LEN)。之后,它将传递从分割字符串中获得的参数,并将这些参数与要检查的密码一起传递回password_hash函数。

它给你的字符串在大多数情况下是由哈希算法的标准定义的,但几乎总是的模式

$<ALGORITHM_ID>$<COST_IN_FORMAT>$<BASE64_ENCODED_SALT><BASE64_ENCODED_HASH>$