Signatur
Beschreibung
sodium_crypto_stream_keygen() generiert einen zufälligen Schlüssel der Länge SODIUM_CRYPTO_STREAM_KEYBYTES (32 Byte) für den Einsatz mit den Streaming-Verschlüsselungsfunktionen von libsodium. Der Schlüssel wird intern mit dem betriebssystemseitigen kryptographischen Zufallszahlengenerator erzeugt und ist damit für kryptographische Zwecke geeignet.
Die Funktion ist der empfohlene Weg, Schlüssel für sodium_crypto_stream() und sodium_crypto_stream_xor() zu erzeugen, da sie sicherstellt, dass die Schlüssellänge korrekt ist und die Zufälligkeit ausreichend stark ist. Eine manuelle Erzeugung über random_bytes() wäre zwar technisch möglich, aber fehleranfälliger.
sodium_crypto_stream implementiert den XSalsa20-Stream-Cipher. Dieser erzeugt aus Schlüssel und Nonce einen Pseudozufallsstrom, der z. B. per XOR mit Klartextdaten zur Verschlüsselung genutzt werden kann. Wichtig: Der Stream-Cipher allein bietet keine Authentifizierung; für authentifizierte Verschlüsselung sollte stattdessen sodium_crypto_secretbox() verwendet werden.
Der erzeugte Schlüssel sollte sicher gespeichert werden, z. B. in einer Umgebungsvariable oder einem Secret-Manager, und nach Verwendung mit sodium_memzero() aus dem Speicher entfernt werden.
Rückgabewert
SODIUM_CRYPTO_STREAM_KEYBYTES (32 Byte) zurück, der als Schlüssel für sodium_crypto_stream() bzw. sodium_crypto_stream_xor() verwendet werden kann.Beispiele
Schlüssel erzeugen und einen Pseudozufallsstrom generieren
<?php
// Schlüssel und Nonce erzeugen
$key = sodium_crypto_stream_keygen();
$nonce = random_bytes(SODIUM_CRYPTO_STREAM_NONCEBYTES);
// 64 Byte Pseudozufallsstrom erzeugen
$stream = sodium_crypto_stream(64, $nonce, $key);
echo 'Schlüssellänge: ' . strlen($key) . ' Byte' . PHP_EOL;
echo 'Streamlänge: ' . strlen($stream) . ' Byte' . PHP_EOL;
echo 'Stream (hex): ' . sodium_bin2hex($stream) . PHP_EOL;
// Schlüssel sicher aus dem Speicher entfernen
sodium_memzero($key);
Daten per XOR mit Stream-Cipher verschlüsseln und entschlüsseln
<?php
$key = sodium_crypto_stream_keygen();
$nonce = random_bytes(SODIUM_CRYPTO_STREAM_NONCEBYTES);
$plaintext = 'Geheime Nachricht!';
// Verschlüsseln
$ciphertext = sodium_crypto_stream_xor($plaintext, $nonce, $key);
echo 'Verschlüsselt (hex): ' . sodium_bin2hex($ciphertext) . PHP_EOL;
// Entschlüsseln (XOR ist selbstinvers)
$decrypted = sodium_crypto_stream_xor($ciphertext, $nonce, $key);
echo 'Entschlüsselt: ' . $decrypted . PHP_EOL;
// Schlüssel sicher aus dem Speicher entfernen
sodium_memzero($key);
// Wichtig · Fallstricke
Keine Authentifizierung: sodium_crypto_stream und sodium_crypto_stream_xor bieten keine Nachrichtenauthentifizierung (MAC). Ein Angreifer kann den Chiffretext manipulieren, ohne dass dies erkannt wird. Für verschlüsselte und authentifizierte Kommunikation sollte sodium_crypto_secretbox() mit sodium_crypto_secretbox_keygen() verwendet werden.
Nonce-Wiederverwendung: Unter keinen Umständen darf dieselbe Kombination aus Schlüssel und Nonce mehr als einmal verwendet werden, da dies die Vertraulichkeit vollständig bricht (Crib-Dragging-Angriff). Eine neue Nonce muss für jede Nachricht frisch erzeugt werden.
Speichersicherheit: Den erzeugten Schlüssel nach Gebrauch mit sodium_memzero() löschen, damit er nicht im Prozess-Speicher verbleibt.