php - AES-256-GCM 在 M1 Macbook 上的 PHP ext-sodium 中不可用

标签 php encryption aes apple-m1 libsodium

最近在工作中,我们有一位新员工参与我们的一个项目,该项目通过 PHP 的钠扩展利用 AES-256-GCM 加密和解密。由于我们都使用Macbook,新员工收到了一台带有M1芯片的2020款Macbook Pro。

启动并运行上述项目的第一次尝试是使用 HomeBrew 设置,该设置运行以下组件:

  • Apache 2.4
  • PHP 7.4
  • MySQL 5.7

我们很快注意到sodium_crypto_aead_aes256gcm_is_available()在我们的代码中返回 false,表明 Macbook 的硬件不支持 AES-256-GCM。运行openssl list-cipher-algorithms | grep "GCM"另一方面给了我们这个列表:

id-aes128-GCM
id-aes192-GCM
id-aes256-GCM
id-aes128-GCM
id-aes192-GCM
id-aes256-GCM

正在运行openssl speed -elapsed -evp aes-256-gcm也返回了预期的输出,因此 openssl 似乎可以访问/能够使用它。

You have chosen to measure elapsed time instead of user CPU time.
Doing aes-256-gcm for 3s on 16 size blocks: 26616041 aes-256-gcm's in 3.00s
Doing aes-256-gcm for 3s on 64 size blocks: 6757776 aes-256-gcm's in 3.00s
Doing aes-256-gcm for 3s on 256 size blocks: 1647975 aes-256-gcm's in 3.00s
Doing aes-256-gcm for 3s on 1024 size blocks: 411604 aes-256-gcm's in 3.00s
Doing aes-256-gcm for 3s on 8192 size blocks: 51239 aes-256-gcm's in 3.00s
LibreSSL 2.8.3
built on: date not available
options:bn(64,64) rc4(ptr,int) des(idx,cisc,16,int) aes(partial) blowfish(idx)
compiler: information not available
使用该项目的 docker 版本的第二次尝试产生了相同的结果,并且还声称硬件不支持带有 AEAD 的 AES-256-GCM,这是预期的,因为它在相同的主机硬件上运行。这是使用 Dockerhub 的官方 PHP 7.4 镜像完成的。

关于 M1 芯片、使用 (lib)sodium 的 AES-256-GCM 和 PHP 的组合是否存在任何已知问题?我们花了几天时间在这里和支持板上进行搜索,但这种组合似乎相当小众。目前,我建议每个开发人员仍使用基于英特尔的 Macbook,因为该平台上的一切都是开箱即用的。

到目前为止,我们已经检查了以下内容:

  • PHP 中启用了 ext-sodium 吗?是的
  • 它可以在使用 HomeBrew 的基于 Intel 的 Macbook Pro 上运行吗?是的
  • 它可以在使用 Docker (compose) 的基于 Intel 的 Macbook Pro 上运行吗?是的
  • OpenSSL 支持 AES-256-GCM 吗?是的

最佳答案

further inquiry之后在 Apple 支持论坛上,他们向我指出了 libsodium 中尚未完全提供 ARM 硬件加速支持的方向。标题为 Support for AES and GCM instructions on ARM processors #363 的 GitHub 问题进一步表明,鉴于该问题于 2016 年提出并于 2018 年突然关闭,似乎没有立即计划立即这样做。

目前,如果您的项目将在 ARM 架构上开发或运行,我建议您对 AES-256-GCM 使用 OpenSSL。他们似乎已经为 ARM 环境实现了硬件加速。

关于php - AES-256-GCM 在 M1 Macbook 上的 PHP ext-sodium 中不可用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67982144/

相关文章:

c# - 使用 CryptDecrypt 解密 RijndaelManaged 加密字符串

javascript - 缓存动态网页(页面可能 99% 是静态的但包含一些动态内容)

javascript - 使用 PHP 和 MySql 上传带有表单数据的 AngularJS 文件

php - 当iframe嵌入式视频播放,暂停,缓冲时如何显示警报

c# - MemoryStream 到 String,然后返回到 MemoryStream,而不添加任何字节(编码等)

Python 文件加密

.net - 使用 AesManaged 解密之前验证 key /IV ?或者在 CryptographicException 发生之前避免它?

php - Codeigniter 2 将 Controller 限制为命令行

encryption - 使用硬件加密设备(例如 USB 加密狗/ keystore )而不是使用软件库是否有正当理由?

javascript - CryptoJS javascript AES-128,欧洲央行加密/解密