6

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

PHP 页面的示例输出:

$2y$10$.vGA1O9wmRjrwAVXD98HNOgsNpDczlqm3Jq7KnEd1rVAGv3Fykk1a

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

4

1 回答 1

1

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

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

它给你的字符串在大多数情况下是由散列算法的标准定义的,但几乎总是符合

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

于 2019-05-20T17:02:53.630 回答