我知道PHP函数,password_hash
输出算法,cost,salt和hash都在一个字符串中,因此password_verify
可以检查密码。
PHP page的示例输出:
$2y$10$.vGA1O9wmRjrwAVXD98HNOgsNpDczlqm3Jq7KnEd1rVAGv3Fykk1a
所以 $ 2y $ 代表算法, 10 代表成本。
但password_verify
如何将哈希值与哈希分开?之后我没有看到任何标识符将两者分开。
答案 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>$