Start · Sprachen · PHP · Referenz · sodium_crypto_aead_chacha20poly1305_keygen

sodium_crypto_aead_chacha20poly1305_keygen

Funktion

Generiert einen kryptografisch sicheren, zufälligen Schlüssel für die ChaCha20-Poly1305-AEAD-Verschlüsselung.

seit PHP 7.2.0 Kategorie: crypto

Signatur

sodium_crypto_aead_chacha20poly1305_keygen(): string

Beschreibung

sodium_crypto_aead_chacha20poly1305_keygen() erzeugt einen zufälligen 256-Bit-Schlüssel (32 Bytes), der für die authentifizierte Verschlüsselung mit zugehörigen Daten (AEAD) mittels des ChaCha20-Poly1305-Algorithmus verwendet werden kann. Die Funktion nutzt intern einen kryptografisch sicheren Zufallsgenerator (CSPRNG) und stellt sicher, dass der erzeugte Schlüssel für den Einsatz in Produktivumgebungen geeignet ist.

ChaCha20-Poly1305 ist ein modernes, schnelles AEAD-Verschlüsselungsverfahren, das Vertraulichkeit und Integrität der Daten gleichzeitig sicherstellt. Der mit dieser Funktion generierte Schlüssel wird typischerweise in Kombination mit sodium_crypto_aead_chacha20poly1305_encrypt() und sodium_crypto_aead_chacha20poly1305_decrypt() eingesetzt.

Im Gegensatz zur manuellen Schlüsselerzeugung über random_bytes() garantiert diese Funktion, dass der Schlüssel exakt die von der Bibliothek erwartete Länge (SODIUM_CRYPTO_AEAD_CHACHA20POLY1305_KEYBYTES) und Qualität besitzt. Der Schlüssel sollte sicher gespeichert und niemals im Klartext übertragen werden.

Beachte, dass ChaCha20-Poly1305 in der IETF-Variante (sodium_crypto_aead_chacha20poly1305_ietf_keygen()) einen längeren Nonce (96 statt 64 Bit) verwendet und für viele Anwendungsfälle bevorzugt wird.

Rückgabewert

Typ
string
Beschreibung
Gibt einen binären String mit 32 Bytes (SODIUM_CRYPTO_AEAD_CHACHA20POLY1305_KEYBYTES) zurück, der einen kryptografisch sicheren Zufallsschlüssel enthält.

Beispiele

Schlüssel erzeugen und Nachricht verschlüsseln

<?php
// Schlüssel generieren
$key = sodium_crypto_aead_chacha20poly1305_keygen();

// Nonce erzeugen (muss für jede Verschlüsselung einzigartig sein!)
$nonce = random_bytes(SODIUM_CRYPTO_AEAD_CHACHA20POLY1305_NPUBBYTES);

$plaintext = 'Geheime Nachricht';
$additionalData = 'öffentliche Metadaten';

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

echo 'Schlüssellänge: ' . strlen($key) . ' Bytes' . PHP_EOL;
echo 'Ciphertext (hex): ' . bin2hex($ciphertext) . PHP_EOL;

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

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

// Speicher für sensible Daten bereinigen
sodium_memzero($key);
Schlüssellänge: 32 Bytes Ciphertext (hex): <zufälliger Hex-Wert> Entschlüsselt: Geheime Nachricht

Schlüssel sicher speichern und laden

<?php
// Schlüssel erzeugen
$key = sodium_crypto_aead_chacha20poly1305_keygen();

// Schlüssel Base64-kodiert in Datei speichern (nur als Beispiel — in Praxis Secrets-Vault nutzen!)
$encoded = base64_encode($key);
file_put_contents('/secure/path/chacha20.key', $encoded, LOCK_EX);

echo 'Schlüssel gespeichert. Länge: ' . strlen($key) . ' Bytes' . PHP_EOL;
echo 'Konstante SODIUM_CRYPTO_AEAD_CHACHA20POLY1305_KEYBYTES: '
    . SODIUM_CRYPTO_AEAD_CHACHA20POLY1305_KEYBYTES . PHP_EOL;

// Schlüssel später laden
$loadedKey = base64_decode(file_get_contents('/secure/path/chacha20.key'));

if (strlen($loadedKey) !== SODIUM_CRYPTO_AEAD_CHACHA20POLY1305_KEYBYTES) {
    throw new RuntimeException('Ungültige Schlüssellänge!');
}

echo 'Schlüssel erfolgreich geladen.' . PHP_EOL;

sodium_memzero($key);
sodium_memzero($loadedKey);
Schlüssel gespeichert. Länge: 32 Bytes Konstante SODIUM_CRYPTO_AEAD_CHACHA20POLY1305_KEYBYTES: 32 Schlüssel erfolgreich geladen.

// Wichtig · Fallstricke

Nonce-Wiederverwendung ist kritisch: Wird derselbe Nonce mit demselben Schlüssel für zwei unterschiedliche Nachrichten verwendet, ist die Verschlüsselung vollständig kompromittiert. Stelle sicher, dass jeder Nonce nur einmal verwendet wird ("number used once").

Schlüsselspeicherung: Speichere den generierten Schlüssel niemals im Klartext in Datenbanken oder Logs. Verwende sichere Schlüsselverwaltungsdienste (z. B. HashiCorp Vault, AWS KMS) oder verschlüsselte Konfigurationsdateien mit eingeschränkten Dateisystem-Rechten.

Speicher bereinigen: Nach der Verwendung sollte der Schlüssel mit sodium_memzero() aus dem Speicher gelöscht werden, um ihn vor Memory-Dump-Angriffen zu schützen.

Nonce-Länge: Die originale ChaCha20-Poly1305-Variante verwendet einen 64-Bit-Nonce (SODIUM_CRYPTO_AEAD_CHACHA20POLY1305_NPUBBYTES = 8). Für längere Nonces (96 Bit) sollte die IETF-Variante (sodium_crypto_aead_chacha20poly1305_ietf_*) bevorzugt werden.