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