【问题标题】:What is the format of password_hash output?password_hash 输出的格式是什么?
【发布时间】:2013-08-08 17:54:44
【问题描述】:

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

PHP page 的示例输出:

$2y$10$.vGA1O9wmRjrwAVXD98HNOgsNpDczlqm3Jq7KnEd1rVAGv3Fykk1a

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

【问题讨论】:

  • 盐按照指定算法打包到哈希的前X位。
  • 知道了,在这个 SO 问题中找到了有关 CRYPT_BLOWFISH 的更多信息:stackoverflow.com/a/15727563/761902。 salt 是哈希的前 21 个字符。
  • 很高兴知道输出的“格式”(econding),因为如果我假设 UTF8,当您在 php 和 javascript 中执行相同的哈希但不是记录在任何地方,其中一个是正确的编码。
  • @DarioOO 字符集在其中不起作用 - salt 是使用 bcrypt 特定版本的 Base64 编码的,它只使用 ASCII 字符。

标签: php passwords verify php-password-hash


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2013-04-15
    • 2014-12-28
    • 2011-09-25
    • 2012-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-24
    • 1970-01-01
    相关资源
    最近更新 更多