password_hash输出的格式是什么?

时间:2013-08-08 17:54:45

标签: php passwords verify php-password-hash

我知道PHP函数,password_hash输出算法,cost,salt和hash都在一个字符串中,因此password_verify可以检查密码。

PHP page的示例输出:

$2y$10$.vGA1O9wmRjrwAVXD98HNOgsNpDczlqm3Jq7KnEd1rVAGv3Fykk1a

所以 $ 2y $ 代表算法, 10 代表成本。 但password_verify如何将哈希值与哈希分开?之后我没有看到任何标识符将两者分开。

1 个答案:

答案 0 :(得分:0)

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

对于所有其他哈希,salt值是一组定义的字节,这些字节当然被编码为ASCII安全b64,并置于$符号之后,然后验证函数仅需通过以下方式将字符串分成几部分:分隔符$,然后输入第三组字符,得到substr(0,B64_ENCODED_HASH_ALGORITHM_SALT_LEN)。之后,它将传递从拆分字符串中获得的参数,并将其连同密码一起传递回password_hash函数中。

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

的模式

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