password_hash 输出的格式是什么?

ans*_*onl 6 php passwords verify php-password-hash

我知道 PHP 函数,password_hash在一个字符串中输出算法、成本、盐和散列,以便password_verify可以检查密码。

PHP 页面的示例输出:

$2y$10$.vGA1O9wmRjrwAVXD98HNOgsNpDczlqm3Jq7KnEd1rVAGv3Fykk1a
Run Code Online (Sandbox Code Playgroud)

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

133*_*m3r 2

对于密码哈希的 bCrypt 版本。Bcrypt 有一个固定长度的 salt 值。当您使用password_hash()/password_verify()和默认算法时,PHP内部调用的crypt函数有一个16字节的salt。这是作为自定义 Base64 字母表的 22 个字符给出的A-Za-z/.,然后它将字符串解码为字节,因为 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>$