sodium_crypto_aead_aes256gcm_is_available

(PHP 7 >= 7.2.0, PHP 8)

sodium_crypto_aead_aes256gcm_is_available检查硬件是否支持 AES256-GCM

说明

function sodium_crypto_aead_aes256gcm_is_available(): bool

此函数的返回值取决于硬件是否支持硬件加速 AES。

参数

此函数没有参数。

返回值

如果可以安全地使用 AES-256-GCM 加密,则返回 true,否则返回 false

更新日志

版本 说明
8.4.0 现在,此函数在具有 ARM 加密扩展的 aarch64 CPU 上可能返回 true。 以前,仅在 x86 和 x86_64 上检测硬件加速的 AES-256-GCM, 此函数在 aarch64 上始终返回 false
添加备注

用户贡献的备注 1 note

up
5
Soatok Dreamseeker
5 years ago
The reason libsodium has an "is_available()" API for AES-GCM and not the ChaCha-Poly AEAD ciphers is that, unlike OpenSSL, libsodium will not expose AES-GCM unless your processor supports hardware-accelerated AES and PCLMULQDQ instructions.

If you're wondering what that means: software AES is vulnerable to cache-timing vulnerabilities, due to its internal dependence on table look-ups: https://cr.yp.to/antiforgery/cachetiming-20050414.pdf (PDF)

There's a similar attack on the authentication step in GCM (called GMAC or GHASH, depending on context), which leaks the GHASH key (called H) and can be used to perform chosen-ciphertext attacks freely.

- You can learn more about GCM exploits here (under the condition of nonce reuse rather than timing leaks, but the consequence is the same): https://www.youtube.com/watch?v=uxuXFK5XKEU

- You can learn more about AES-GCM here: https://soatok.blog/2020/05/13/why-aes-gcm-sucks/

- You can learn more about how it compares to other encryption modes here: https://soatok.blog/2020/07/12/comparison-of-symmetric-encryption-methods/

The other AEAD modes are safe to implement in software without risk of side-channel leakage.

The take-away is: AES-GCM isn't guaranteed to be available on all hardware because, without hardware support, libsodium will not provide insecure implementations. 

If you want something guaranteed to be available even on hardware you do not control (hello open source maintainers), your choices are ChaCha20-Poly1305 and XChaCha20-Poly1305.

If you can control the hardware and explicitly need AES-GCM (n.b. for FIPS 140-2 validation), feel free to use AES-256-GCM.

<?php
function do_something(string $message, CryptoKeyObject $key): string {
    if (!sodium_crypto_aead_aes256gcm_is_available()) {
        throw new Exception("AES-256-GCM isn't available on your hardware");
    }
    // ... your code here ...
}
?>