我有两个 docker 容器,一个是PHP8.2.3,另一个是PHP7.4.30.

另外,我有包含现有密码散列的数据库(最初是由YII2框架在未知环境中使用密码PASSWORD_HASH创建的).

我创建了test.php,在那里我输出了两件事:

var_dump(password_get_info('$2a$07$6c2eb62b00df224f3d20$.qzdiDRZejMnGytXWsA7Jid7RpWazDc6'))

var_dump(password_verify('password', '$2a$07$6c2eb62b00df224f3d20$.qzdiDRZejMnGytXWsA7Jid7RpWazDc6'))

In PHP 7.4 the results are:

array(3) {
  ["algo"]=>
  NULL
  ["algoName"]=>
  string(7) "unknown"
  ["options"]=>
  array(0) {
  }
}

bool(true)

While in PHP 8.2:

array(3) {
  ["algo"]=>
  NULL
  ["algoName"]=>
  string(7) "unknown"
  ["options"]=>
  array(0) {
  }
}

bool(false)

I know that different hashing algorithms might have been used. But the hashing algorithm should be specified (和 thus identified) in the hash itself.

另外,两个引擎都不知道算法.但是,PHP7.4能够验证密码.

为什么会发生这种情况?

从文档中:

Note that password_hash() returns the algorithm, cost 和 salt as part of the returned hash. Therefore, all information that's needed to verify the hash is included in it. This allows the verify function to verify the hash without needing separate storage for the salt or

推荐答案

你受到了this fix个因素的影响:

格式错误的bcrypt散列在其SALT部分包含$将触发缓冲区超读,并可能错误地验证任何密码是否有效.

[..]

从PHP自己的crypt_blowfish实现的第一个版本开始,"PHP Hack"就存在了,在注释或提交历史记录中没有给出它存在的明确理由.在任何情况下,这样的散列都不是有效的bcrypt散列,并且它不是由password_hash()生成的,这是在PHP中推荐的密码散列API.

虽然这在技术上可能会 destruct 与现有用户的向后兼容性,但这些散列永远不会由password_hash()生成,不被其他bcrypt实现接受,并在应用程序中引入可能的安全漏洞,但它们应该在所有支持的PHP版本中被拒绝.

https://github.com/php/php-src/security/advisories/GHSA-7fj2-8x79-rjf4

这里的重点是这样一个事实:从技术上讲,您的散列从一开始就是无效的,根本不应该存在.

Php相关问答推荐

调用woocommerce_customer_Save_add动作挂钩时发生致命错误

WooCommerce拆分运输包裹上的商品数量增加运输成本

无法使用DOMPDF在PDF中呈现非ANSI字符

模型中的Laravel自定义查询字段

根据在WooCommerce购物车和 checkout 中 Select 的送货方式显示快捷代码内容

如何将对我的域的请求重定向到子文件夹中的索引,同时保留域URL并使用.htaccess?

在Laravel中创建辅助函数时的约定

在WooCommerce Admin产品列表自定义列中显示来自元数据的统计数据

在 PHP MySQL 中自动生成账单编号

Symfony:从控制器内部调用自定义命令

Woocommerce 相关产品按其类别或排名数学主要类别

如何从 URL 核心 PHP 中的 API 获取 JSON?

在 WooCommerce 我的帐户自定义部分显示未购买的产品

如何将文件上传添加到 WooCommerce 结帐?

提交仅包含活动详细信息选项卡表单的主表单

注册命名空间后如何获取xml node 值?

WooCommerce - 调用功能ID不正确.不应直接访问订单属性

我试图在我的视图上显示从数据库中获取的数据,但我无法显示它.拉维尔 10.x /

NetBeans 不显示中文内容

如何获取最后一条消息属于 Laravel 中特定用户的对话列表