Signatur
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
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;
}
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;
// 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.