Start · Sprachen · PHP · Referenz · sodium_crypto_aead_chacha20poly1305_ietf_keygen

sodium_crypto_aead_chacha20poly1305_ietf_keygen

Funktion

Generiert einen kryptographisch sicheren, zufälligen Schlüssel für die <code>ChaCha20-Poly1305-IETF</code>-AEAD-Verschlüsselung.

seit PHP 7.2.0 Kategorie: crypto

Signatur

sodium_crypto_aead_chacha20poly1305_ietf_keygen(): string

Beschreibung

sodium_crypto_aead_chacha20poly1305_ietf_keygen() erzeugt einen zufälligen 256-Bit-Schlüssel (32 Byte), der für die symmetrische, authentifizierte Verschlüsselung mit dem ChaCha20-Poly1305-IETF-Algorithmus verwendet werden kann. Der Schlüssel eignet sich direkt als Eingabe für sodium_crypto_aead_chacha20poly1305_ietf_encrypt() und sodium_crypto_aead_chacha20poly1305_ietf_decrypt().

ChaCha20-Poly1305-IETF ist eine moderne, schnelle und sichere AEAD-Konstruktion (Authenticated Encryption with Associated Data), die sowohl Vertraulichkeit als auch Integrität und Authentizität der verschlüsselten Daten garantiert. Die IETF-Variante verwendet eine 96-Bit-Nonce (im Gegensatz zur originalen 64-Bit-Nonce) und ist daher besser für viele Protokoll-Szenarien geeignet.

Die Funktion nutzt intern den kryptographisch sicheren Zufallsgenerator der libsodium-Bibliothek und ist damit einer manuellen Schlüsselableitung über random_bytes() äquivalent – jedoch klarer in der Absicht und garantiert mit dem richtigen Schlüsselformat kompatibel.

Generierte Schlüssel sollten sicher gespeichert werden, z. B. in Umgebungsvariablen, einem Secrets-Manager oder einem verschlüsselten Schlüsselspeicher. Sie sollten niemals im Klartext in Quellcode oder Versionsverwaltung abgelegt werden.

Rückgabewert

Typ
string
Beschreibung
Gibt einen zufälligen Binärstring mit einer Länge von SODIUM_CRYPTO_AEAD_CHACHA20POLY1305_IETF_KEYBYTES (32 Byte) zurück, der als Schlüssel für die ChaCha20-Poly1305-IETF-AEAD-Funktionen verwendet werden kann.

Beispiele

Schlüssel generieren und Nachricht verschlüsseln

<?php
// Schlüssel und Nonce erzeugen
$key   = sodium_crypto_aead_chacha20poly1305_ietf_keygen();
$nonce = random_bytes(SODIUM_CRYPTO_AEAD_CHACHA20POLY1305_IETF_NPUBBYTES); // 12 Byte

$plaintext       = 'Geheime Nachricht';
$additionalData  = 'optionale-kontextdaten';

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

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

if ($decrypted === false) {
    throw new RuntimeException('Entschlüsselung fehlgeschlagen – Daten wurden möglicherweise manipuliert.');
}

echo $decrypted;

// Speicher bereinigen
sodium_memzero($key);
Geheime Nachricht

Schlüssel Base64-kodiert speichern und wiederverwenden

<?php
// Schlüssel generieren und für spätere Verwendung kodieren
$key       = sodium_crypto_aead_chacha20poly1305_ietf_keygen();
$keyBase64 = sodium_bin2base64($key, SODIUM_BASE64_VARIANT_ORIGINAL);

// Schlüssel z. B. in .env oder Secrets-Manager ablegen
echo 'CHACHA_KEY=' . $keyBase64 . PHP_EOL;

// Später: Schlüssel aus Umgebungsvariable laden
$keyFromEnv = sodium_base642bin(
    getenv('CHACHA_KEY'),
    SODIUM_BASE64_VARIANT_ORIGINAL
);

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

echo 'Schlüssel korrekt geladen, Länge: ' . strlen($keyFromEnv) . ' Byte' . PHP_EOL;
CHACHA_KEY=<Base64-kodierter Schlüssel> Schlüssel korrekt geladen, Länge: 32 Byte

// Wichtig · Fallstricke

Sicherheitshinweise:

  • Speichere generierte Schlüssel niemals im Klartext in Quellcode oder Versionsverwaltungssystemen wie Git.
  • Die Nonce muss für jede Verschlüsselungsoperation mit demselben Schlüssel einmalig und einzigartig sein. Eine Wiederverwendung von Nonce + Schlüssel bricht die Sicherheit vollständig.
  • Die Länge des Schlüssels ist durch die Konstante SODIUM_CRYPTO_AEAD_CHACHA20POLY1305_IETF_KEYBYTES (32) definiert.
  • Verwende sodium_memzero(), um den Schlüssel nach der Verwendung sicher aus dem Speicher zu entfernen.
  • Diese Funktion ist für die IETF-Variante gedacht (96-Bit-Nonce). Für die originale Variante existiert sodium_crypto_aead_chacha20poly1305_keygen() mit einer 64-Bit-Nonce.