Start · Sprachen · PHP · Referenz · sodium_crypto_aead_aes256gcm_keygen

sodium_crypto_aead_aes256gcm_keygen

Funktion

Generiert einen kryptografisch sicheren, zufälligen Schlüssel für die AES-256-GCM-Verschlüsselung.

seit PHP 7.2.0 Kategorie: crypto

Signatur

sodium_crypto_aead_aes256gcm_keygen(): string

Beschreibung

sodium_crypto_aead_aes256gcm_keygen() erzeugt einen zufälligen 256-Bit-Schlüssel (32 Byte), der für die authentifizierte Verschlüsselung mit sodium_crypto_aead_aes256gcm_encrypt() und sodium_crypto_aead_aes256gcm_decrypt() verwendet werden kann. Die Funktion nutzt intern einen kryptografisch starken Zufallszahlengenerator und ist damit die empfohlene Methode zur sicheren Schlüsselerzeugung.

AES-256-GCM ist ein symmetrisches Verschlüsselungsverfahren mit integrierter Authentifizierung (AEAD — Authenticated Encryption with Associated Data). Neben dem eigentlichen Nachrichteninhalt kann zusätzlich ein öffentlicher, aber authentifizierter Kontext mitgegeben werden, der zwar nicht verschlüsselt, aber vor Manipulationen geschützt ist.

Wichtig: Nicht alle Prozessoren unterstützen AES-NI-Hardware-Beschleunigung. Bevor AES-256-GCM eingesetzt wird, sollte geprüft werden, ob die Funktion sodium_crypto_aead_aes256gcm_is_available() true zurückgibt. Auf Systemen ohne Hardware-Unterstützung empfiehlt sich stattdessen sodium_crypto_aead_chacha20poly1305_keygen().

Der erzeugte Schlüssel sollte niemals im Klartext gespeichert oder übertragen werden. Für die dauerhafte Speicherung bietet sich eine Ableitung aus einem Passwort mittels sodium_crypto_pwhash() oder die sichere Speicherung in einem Key-Management-System an.

Rückgabewert

Typ
string
Beschreibung
Gibt einen zufälligen binären String der Länge SODIUM_CRYPTO_AEAD_AES256GCM_KEYBYTES (32 Byte) zurück, der als Schlüssel für AES-256-GCM-Operationen genutzt werden kann.

Beispiele

Schlüssel erzeugen und Nachricht verschlüsseln

<?php
// Prüfen ob AES-256-GCM auf dieser Hardware verfügbar ist
if (!sodium_crypto_aead_aes256gcm_is_available()) {
    throw new RuntimeException('AES-256-GCM wird auf dieser Hardware nicht unterstützt.');
}

// Schlüssel und Nonce generieren
$key   = sodium_crypto_aead_aes256gcm_keygen();
$nonce = random_bytes(SODIUM_CRYPTO_AEAD_AES256GCM_NPUBBYTES); // 12 Byte

$plaintext        = 'Geheime Nachricht';
$additionalData   = 'öffentlicher Kontext'; // nicht verschlüsselt, aber authentifiziert

// Verschlüsseln
$ciphertext = sodium_crypto_aead_aes256gcm_encrypt(
    $plaintext,
    $additionalData,
    $nonce,
    $key
);

echo 'Verschlüsselt (hex): ' . bin2hex($ciphertext) . PHP_EOL;

// Entschlüsseln
$decrypted = sodium_crypto_aead_aes256gcm_decrypt(
    $ciphertext,
    $additionalData,
    $nonce,
    $key
);

if ($decrypted === false) {
    throw new RuntimeException('Entschlüsselung fehlgeschlagen — Daten wurden manipuliert!');
}

echo 'Entschlüsselt: ' . $decrypted . PHP_EOL;

// Schlüssel sicher aus dem Speicher entfernen
sodium_memzero($key);
Verschlüsselt (hex): <zufälliger Hex-Wert> Entschlüsselt: Geheime Nachricht

Schlüssellänge und Hex-Kodierung zur Speicherung

<?php
if (!sodium_crypto_aead_aes256gcm_is_available()) {
    throw new RuntimeException('AES-256-GCM nicht verfügbar.');
}

$key = sodium_crypto_aead_aes256gcm_keygen();

echo 'Schlüssellänge in Byte: ' . strlen($key) . PHP_EOL;
echo 'SODIUM_CRYPTO_AEAD_AES256GCM_KEYBYTES: ' . SODIUM_CRYPTO_AEAD_AES256GCM_KEYBYTES . PHP_EOL;

// Für Speicherung als Hex-String kodieren
$keyHex = bin2hex($key);
echo 'Schlüssel (hex, 64 Zeichen): ' . $keyHex . PHP_EOL;

// Aus Hex wieder zurück in Binärformat
$keyBin = hex2bin($keyHex);

sodium_memzero($key);
Schlüssellänge in Byte: 32 SODIUM_CRYPTO_AEAD_AES256GCM_KEYBYTES: 32 Schlüssel (hex, 64 Zeichen): <64-stelliger Hex-String>

// Wichtig · Fallstricke

Hardware-Verfügbarkeit: AES-256-GCM ist nur auf Prozessoren mit AES-NI-Befehlssatz performant und sicher nutzbar. Vor dem Einsatz immer sodium_crypto_aead_aes256gcm_is_available() prüfen — ist sie false, liefert die Verschlüsselung einen Fehler.

Nonce-Wiederverwendung: Die Nonce (Number used once) darf für denselben Schlüssel niemals zweimal verwendet werden. Eine Wiederverwendung bricht die Sicherheitsgarantien von GCM vollständig. Für eine sichere Nonce-Strategie empfiehlt sich ein atomarer Zähler oder random_bytes(SODIUM_CRYPTO_AEAD_AES256GCM_NPUBBYTES).

Schlüsselverwaltung: Erzeugte Schlüssel sollten nach Gebrauch mit sodium_memzero() aus dem Arbeitsspeicher gelöscht werden, um das Auslesen durch andere Prozesse oder Speicher-Dumps zu erschweren.

Alternativen: Wenn die Hardware kein AES-NI unterstützt oder plattformübergreifende Kompatibilität benötigt wird, ist sodium_crypto_aead_chacha20poly1305_ietf_keygen() eine sichere und schnelle Alternative.