Signatur
Beschreibung
sodium_crypto_kx_seed_keypair() erzeugt ein Schlüsselpaar für den Libsodium-Schlüsselaustausch (crypto_kx) auf deterministische Weise: Aus demselben Seed wird immer exakt dasselbe Schlüsselpaar reproduziert. Dies ist nützlich, wenn Schlüssel aus einem Master-Secret oder einem anderen deterministischen Verfahren (z. B. einem KDF-Output) abgeleitet werden sollen, ohne sie separat speichern zu müssen.
Das zurückgegebene Byte-Paar enthält sowohl den geheimen als auch den öffentlichen Schlüssel in einem einzigen String. Mit sodium_crypto_kx_secretkey() und sodium_crypto_kx_publickey() können die beiden Teile extrahiert werden. Das Schlüsselpaar eignet sich anschließend für sodium_crypto_kx_client_session_keys() und sodium_crypto_kx_server_session_keys(), um sitzungsgebundene Verschlüsselungsschlüssel auszuhandeln.
Im Gegensatz zu sodium_crypto_kx_keypair(), das einen zufälligen Schlüssel generiert, liefert diese Funktion bei gleichem Seed stets das gleiche Ergebnis – die Sicherheit hängt daher vollständig von der Geheimhaltung und Qualität (Entropie) des Seeds ab. Der Seed muss exakt SODIUM_CRYPTO_KX_SEEDBYTES Bytes lang sein.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $seed Pflicht | string | Ein Byte-String mit exakt SODIUM_CRYPTO_KX_SEEDBYTES (32) Bytes hoher Entropie, aus dem das Schlüsselpaar deterministisch abgeleitet wird. Muss geheim gehalten werden. |
Rückgabewert
SODIUM_CRYPTO_KX_SECRETKEYBYTES + SODIUM_CRYPTO_KX_PUBLICKEYBYTES Bytes. Mit sodium_crypto_kx_secretkey() bzw. sodium_crypto_kx_publickey() lassen sich die Einzelteile extrahieren.Beispiele
Schlüsselpaar aus festem Seed ableiten und Teile extrahieren
<?php
// Seed mit exakt SODIUM_CRYPTO_KX_SEEDBYTES Bytes
$seed = random_bytes(SODIUM_CRYPTO_KX_SEEDBYTES);
// Deterministisches Schlüsselpaar aus dem Seed erzeugen
$keypair = sodium_crypto_kx_seed_keypair($seed);
// Öffentlichen und geheimen Schlüssel extrahieren
$secretKey = sodium_crypto_kx_secretkey($keypair);
$publicKey = sodium_crypto_kx_publickey($keypair);
echo 'Seed-Länge: ' . strlen($seed) . ' Bytes' . PHP_EOL;
echo 'SecretKey-Länge: ' . strlen($secretKey) . ' Bytes' . PHP_EOL;
echo 'PublicKey-Länge: ' . strlen($publicKey) . ' Bytes' . PHP_EOL;
echo 'PublicKey (hex): ' . sodium_bin2hex($publicKey) . PHP_EOL;
Reproduzierbares Schlüsselpaar für Client-Server-Schlüsselaustausch
<?php
// Fixer Seed (z. B. aus sicherem Passwortspeicher oder KDF)
$seed = sodium_hex2bin('4a656672657973206b65792073656564206578616d706c652e2e2e2e2e2e2e2e');
// Schlüsselpaare für Client und Server aus demselben Seed ableiten
// (in der Praxis würden Client und Server unterschiedliche Seeds nutzen)
$clientKeypair = sodium_crypto_kx_seed_keypair($seed);
$serverKeypair = sodium_crypto_kx_keypair(); // zufällig für den Server
$serverPublicKey = sodium_crypto_kx_publickey($serverKeypair);
$clientPublicKey = sodium_crypto_kx_publickey($clientKeypair);
// Sitzungsschlüssel aushandeln
[$rxClient, $txClient] = sodium_crypto_kx_client_session_keys($clientKeypair, $serverPublicKey);
[$rxServer, $txServer] = sodium_crypto_kx_server_session_keys($serverKeypair, $clientPublicKey);
// Client-TX muss Server-RX entsprechen und umgekehrt
echo 'Schlüssel stimmen überein: ';
echo ($txClient === $rxServer && $rxClient === $txServer) ? 'Ja' : 'Nein';
echo PHP_EOL;
// Wichtig · Fallstricke
Sicherheit des Seeds: Da das Schlüsselpaar vollständig deterministisch aus dem Seed abgeleitet wird, ist die Sicherheit des gesamten Systems direkt an die Geheimhaltung und Entropie des Seeds geknüpft. Ein vorhersehbarer oder kompromittierter Seed macht alle daraus erzeugten Schlüssel unsicher.
Seed-Länge: Der Seed muss exakt SODIUM_CRYPTO_KX_SEEDBYTES (32) Bytes lang sein – andernfalls wird eine SodiumException geworfen.
Kein Zufalls-Schlüssel: Wird kein deterministisches Verhalten benötigt, sollte stattdessen sodium_crypto_kx_keypair() verwendet werden, das intern einen kryptografisch sicheren Zufallsgenerator nutzt.
Speicher bereinigen: Geheime Schlüssel und Seeds sollten nach der Verwendung mit sodium_memzero() aus dem Speicher gelöscht werden, um Leaks zu minimieren.