Signatur
Beschreibung
Diese Funktion erzeugt einen zufälligen, 256-Bit-Schlüssel (32 Byte) für die Verwendung mit dem XChaCha20-Poly1305-Secretstream-Algorithmus. Der Schlüssel wird intern mit einem kryptografisch sicheren Zufallsgenerator erzeugt und ist somit für die Verschlüsselung von Datenströmen geeignet.
Der Secretstream-Mechanismus ermöglicht die sichere, authentifizierte Verschlüsselung von Nachrichten- oder Datenströmen in Abschnitten (sog. Chunks). Typische Anwendungsfälle sind das Verschlüsseln großer Dateien, Netzwerk-Streams oder beliebiger Sequenzen von Nachrichten, bei denen die Reihenfolge der Chunks gewahrt und Manipulationen erkannt werden sollen.
Der zurückgegebene Schlüssel sollte niemals im Klartext gespeichert oder übertragen werden. Für die sichere Speicherung empfiehlt sich eine Ableitung über sodium_crypto_pwhash() oder eine verschlüsselte Übertragung per sodium_crypto_box() bzw. sodium_crypto_secretbox().
Der generierte Schlüssel wird ausschließlich für die Initialisierung eines Secretstream-Push- (sodium_crypto_secretstream_xchacha20poly1305_init_push()) oder Pull-Kontexts (sodium_crypto_secretstream_xchacha20poly1305_init_pull()) verwendet.
Rückgabewert
SODIUM_CRYPTO_SECRETSTREAM_XCHACHA20POLY1305_KEYBYTES Bytes (32 Byte) zurück, der den zufällig generierten Schlüssel enthält.Beispiele
Schlüssel erzeugen und Stream verschlüsseln
<?php
// Schlüssel erzeugen
$key = sodium_crypto_secretstream_xchacha20poly1305_keygen();
// Push-Kontext initialisieren (Verschlüsselungsseite)
[$state, $header] = sodium_crypto_secretstream_xchacha20poly1305_init_push($key);
// Nachrichten verschlüsseln
$chunk1 = sodium_crypto_secretstream_xchacha20poly1305_push(
$state,
'Erster geheimer Datensatz',
'',
SODIUM_CRYPTO_SECRETSTREAM_XCHACHA20POLY1305_TAG_MESSAGE
);
$chunk2 = sodium_crypto_secretstream_xchacha20poly1305_push(
$state,
'Zweiter geheimer Datensatz',
'',
SODIUM_CRYPTO_SECRETSTREAM_XCHACHA20POLY1305_TAG_FINAL
);
echo 'Header-Länge: ' . strlen($header) . ' Byte' . PHP_EOL;
echo 'Chunk 1 Länge: ' . strlen($chunk1) . ' Byte' . PHP_EOL;
echo 'Chunk 2 Länge: ' . strlen($chunk2) . ' Byte' . PHP_EOL;
Verschlüsseln und anschließend entschlüsseln
<?php
$key = sodium_crypto_secretstream_xchacha20poly1305_keygen();
// Verschlüsseln
[$pushState, $header] = sodium_crypto_secretstream_xchacha20poly1305_init_push($key);
$verschluesselt = sodium_crypto_secretstream_xchacha20poly1305_push(
$pushState,
'Geheime Nachricht',
'',
SODIUM_CRYPTO_SECRETSTREAM_XCHACHA20POLY1305_TAG_FINAL
);
// Entschlüsseln
$pullState = sodium_crypto_secretstream_xchacha20poly1305_init_pull($header, $key);
$ergebnis = sodium_crypto_secretstream_xchacha20poly1305_pull($pullState, $verschluesselt);
if ($ergebnis !== false) {
[$klartext, $tag] = $ergebnis;
echo 'Entschlüsselt: ' . $klartext . PHP_EOL;
echo 'Tag: ' . $tag . PHP_EOL;
} else {
echo 'Entschlüsselung fehlgeschlagen!' . PHP_EOL;
}
// Wichtig · Fallstricke
Sicherheitshinweise:
- Den erzeugten Schlüssel niemals im Klartext loggen, in Fehlermeldungen ausgeben oder unsicher übertragen.
- Der Schlüssel sollte nach Verwendung mit
sodium_memzero()aus dem Speicher gelöscht werden, um ihn nicht unnötig lange im RAM zu halten. - Jeder Schlüssel sollte einmalig und ausschließlich für einen bestimmten Stream verwendet werden. Eine Wiederverwendung mit unterschiedlichen Daten untergräbt die Sicherheitseigenschaften des Algorithmus.
- Der Header, der von
sodium_crypto_secretstream_xchacha20poly1305_init_push()zurückgegeben wird, muss dem Empfänger zusammen mit den verschlüsselten Daten übermittelt werden – er ist jedoch kein Geheimnis und darf im Klartext übertragen werden.