Start · Sprachen · PHP · Referenz · sodium_crypto_aead_aes256gcm_is_available

sodium_crypto_aead_aes256gcm_is_available

Funktion

Prüft, ob die aktuelle Hardware-Plattform AES-256-GCM über CPU-Beschleunigung unterstützt.

seit PHP 7.2.0 Kategorie: crypto

Signatur

sodium_crypto_aead_aes256gcm_is_available(): bool

Beschreibung

sodium_crypto_aead_aes256gcm_is_available() gibt true zurück, wenn der laufende Prozessor die nötigen Befehlssatz-Erweiterungen (z. B. AES-NI auf x86/x64) besitzt, um AES-256-GCM hardwarebeschleunigt ausführen zu können. Ohne diese Unterstützung ist der Einsatz von sodium_crypto_aead_aes256gcm_encrypt() und verwandten Funktionen nicht möglich — sie würden eine SodiumException auslösen.

Diese Funktion sollte daher immer aufgerufen werden, bevor AES-256-GCM-Funktionen genutzt werden, um Laufzeitfehler zu vermeiden. Ist AES-256-GCM nicht verfügbar, bietet sich als portabler Ersatz sodium_crypto_aead_chacha20poly1305_encrypt() an, das keine spezielle Hardware-Unterstützung benötigt.

Der Unterschied zu anderen AEAD-Verfahren in Libsodium ist wichtig: Während ChaCha20-Poly1305 auf allen Plattformen läuft, ist AES-256-GCM explizit an Hardware-Features gebunden. In Produktivumgebungen empfiehlt sich daher eine Fallback-Strategie, die zur Laufzeit das geeignete Verfahren wählt.

Rückgabewert

Typ
bool
Beschreibung
Gibt true zurück, wenn die Hardware AES-256-GCM unterstützt (AES-NI o. Ä. verfügbar ist), andernfalls false.

Beispiele

Grundlegende Verfügbarkeitsprüfung vor der Verschlüsselung

<?php
if (sodium_crypto_aead_aes256gcm_is_available()) {
    $key   = sodium_crypto_aead_aes256gcm_keygen();
    $nonce = random_bytes(SODIUM_CRYPTO_AEAD_AES256GCM_NPUBBYTES);
    $ad    = 'zusaetzliche-daten';
    $ciphertext = sodium_crypto_aead_aes256gcm_encrypt('Geheimtext', $ad, $nonce, $key);
    echo 'Verschlüsselt (' . strlen($ciphertext) . ' Bytes).' . PHP_EOL;
} else {
    echo 'AES-256-GCM wird von dieser Hardware nicht unterstützt.' . PHP_EOL;
}
Verschlüsselt (26 Bytes).

Fallback auf ChaCha20-Poly1305 bei fehlender AES-NI-Unterstützung

<?php
function encrypt_message(string $plaintext, string $ad): array {
    if (sodium_crypto_aead_aes256gcm_is_available()) {
        $key   = sodium_crypto_aead_aes256gcm_keygen();
        $nonce = random_bytes(SODIUM_CRYPTO_AEAD_AES256GCM_NPUBBYTES);
        $ct    = sodium_crypto_aead_aes256gcm_encrypt($plaintext, $ad, $nonce, $key);
        $algo  = 'aes256gcm';
    } else {
        $key   = sodium_crypto_aead_chacha20poly1305_ietf_keygen();
        $nonce = random_bytes(SODIUM_CRYPTO_AEAD_CHACHA20POLY1305_IETF_NPUBBYTES);
        $ct    = sodium_crypto_aead_chacha20poly1305_ietf_encrypt($plaintext, $ad, $nonce, $key);
        $algo  = 'chacha20poly1305_ietf';
    }
    return compact('algo', 'key', 'nonce', 'ct');
}

$result = encrypt_message('Hallo Welt', 'kontext');
echo 'Verwendetes Verfahren: ' . $result['algo'] . PHP_EOL;
Verwendetes Verfahren: aes256gcm

// Wichtig · Fallstricke

Wichtig: Rufen Sie diese Funktion niemals weg und gehen Sie nicht davon aus, dass AES-256-GCM überall verfügbar ist. Insbesondere in Containerumgebungen, auf ARM-Systemen oder in älteren Virtualisierungsumgebungen kann AES-NI fehlen oder deaktiviert sein.

Die Funktion ist sehr kostengünstig (kein Syscall, rein CPU-Feature-Check) und kann ohne Bedenken auch häufig aufgerufen werden. Das Ergebnis kann für die Laufzeit gecacht werden, da sich die Hardware-Unterstützung nicht ändert.