Start · Sprachen · PHP · Referenz · sodium_crypto_stream_keygen

sodium_crypto_stream_keygen

Funktion

Erzeugt einen kryptographisch sicheren, zufälligen Schlüssel für die Verwendung mit <code>sodium_crypto_stream()</code> und <code>sodium_crypto_stream_xor()</code>.

seit PHP 7.2.0 Kategorie: crypto

Signatur

sodium_crypto_stream_keygen(): string

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

Typ
string
Beschreibung
Gibt einen zufälligen Binär-String der Länge 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);
Schlüssellänge: 32 Byte Streamlänge: 64 Byte Stream (hex): <64 zufällige Hex-Zeichen>

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);
Verschlüsselt (hex): <hex-kodierter Geheimtext> Entschlüsselt: Geheime Nachricht!

// 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.