Php 密码\u散列输出的格式是什么?

Php 密码\u散列输出的格式是什么?,php,passwords,verify,php-password-hash,Php,Passwords,Verify,Php Password Hash,我知道PHP函数,password\u hash在一个字符串中输出算法、成本、salt和hash,因此password\u verify可以检查密码 样本输出来自: 所以$2y$代表算法,10代表成本。 但是password\u如何验证将盐与散列分开呢?我没有看到任何标识符将两者区分开来 用于bCrypt版本的密码哈希。 Bcrypt具有固定长度的salt值。当使用默认算法使用password\u hash()/password\u verify()时,PHP内部调用的crypt函数有一个16字

我知道PHP函数,
password\u hash
在一个字符串中输出算法、成本、salt和hash,因此
password\u verify
可以检查密码

样本输出来自:

所以$2y$代表算法,10代表成本。
但是
password\u如何验证
将盐与散列分开呢?我没有看到任何标识符将两者区分开来

用于bCrypt版本的密码哈希。 Bcrypt具有固定长度的salt值。当使用默认算法使用password\u hash()/password\u verify()时,PHP内部调用的crypt函数有一个16字节的salt。这是自定义base64字母表的22个字符
a-Za-z/
,然后它将字符串解码为字节,因为22个B64字符编码16.5字节,因此不考虑额外的半字节数据

对于所有其他散列,salt值是一组已定义的字节,这些字节当然编码为ASCII safe b64,并放在
$
符号之后,然后验证函数只需通过分隔符
$
将字符串拆分为多个部分,然后使用第三组字符获取
子字符串(0,B64_ENCODED_HASH_ALGORITHM_SALT_LEN)
。之后,它将传递从拆分字符串中获得的参数,并将这些参数与密码一起传递回
password_HASH
函数进行检查

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


$$$

根据指定的算法,salt被打包到哈希的前X位。明白了,在这个问题中找到了关于CRYPT_河豚的更多信息:。salt是哈希的前21个字符。了解“格式”(econding)会很好因为如果我假设UTF8,当您在php和javascript中执行相同的哈希时,它不能正常工作,但没有记录在任何地方,其中一个是正确的编码。可能重复的@Darioo字符集在这方面不起作用-salt是用bcrypt特定版本的Base64编码的,它只使用ASCII字符.
$2y$10$.vGA1O9wmRjrwAVXD98HNOgsNpDczlqm3Jq7KnEd1rVAGv3Fykk1a