Signatur
Beschreibung
sodium_crypto_box_seed_keypair erzeugt ein Schlüsselpaar (bestehend aus geheimem Schlüssel und öffentlichem Schlüssel) für die authentifizierte Public-Key-Verschlüsselung mit sodium_crypto_box. Im Gegensatz zu sodium_crypto_box_keypair, das einen zufälligen Schlüssel generiert, wird das Ergebnis hier deterministisch aus dem übergebenen Seed abgeleitet – gleicher Seed ergibt immer dasselbe Schlüsselpaar.
Diese Funktion ist besonders nützlich, wenn Schlüssel reproduzierbar aus einem geheimen Master-Seed oder einem Passwort (z. B. nach vorheriger Ableitung mit sodium_crypto_pwhash) erzeugt werden sollen, ohne sie dauerhaft speichern zu müssen. Der zurückgegebene String enthält den geheimen und den öffentlichen Schlüssel in einem kombinierten Keypair-String, aus dem beide Teile mit sodium_crypto_box_secretkey und sodium_crypto_box_publickey extrahiert werden können.
Der Seed muss exakt SODIUM_CRYPTO_BOX_SEEDBYTES (32 Bytes) lang sein und sollte kryptografisch zufällig oder aus einer sicheren Key-Derivation-Funktion stammen. Ein vorhersehbarer oder zu kurzer Seed gefährdet die Sicherheit aller daraus abgeleiteten Schlüssel erheblich.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $seed Pflicht | string | Ein kryptografisch sicherer Seed mit einer Länge von genau SODIUM_CRYPTO_BOX_SEEDBYTES (32 Bytes). Aus diesem Wert wird das Schlüsselpaar deterministisch abgeleitet. |
Rückgabewert
sodium_crypto_box_secretkey, der öffentliche Schlüssel mit sodium_crypto_box_publickey extrahiert werden.Beispiele
Deterministisches Schlüsselpaar aus zufälligem Seed erzeugen
<?php
// Seed zufällig und sicher erzeugen (z. B. einmalig und sicher speichern)
$seed = random_bytes(SODIUM_CRYPTO_BOX_SEEDBYTES);
// Schlüsselpaar aus Seed ableiten
$keypair = sodium_crypto_box_seed_keypair($seed);
// Schlüssel extrahieren
$secretKey = sodium_crypto_box_secretkey($keypair);
$publicKey = sodium_crypto_box_publickey($keypair);
echo 'Public Key (hex): ' . bin2hex($publicKey) . PHP_EOL;
echo 'Secret Key (hex): ' . bin2hex($secretKey) . PHP_EOL;
// Dasselbe Keypair erneut aus demselben Seed ableiten
$keypair2 = sodium_crypto_box_seed_keypair($seed);
echo 'Gleiche Schlüssel? ' . ($keypair === $keypair2 ? 'Ja' : 'Nein') . PHP_EOL;
Schlüsselpaar aus passwortbasiertem Seed ableiten
<?php
$password = 'Mein-Geheimes-Passwort';
$salt = random_bytes(SODIUM_CRYPTO_PWHASH_SALTBYTES);
// Seed kryptografisch sicher aus Passwort ableiten
$seed = sodium_crypto_pwhash(
SODIUM_CRYPTO_BOX_SEEDBYTES,
$password,
$salt,
SODIUM_CRYPTO_PWHASH_OPSLIMIT_INTERACTIVE,
SODIUM_CRYPTO_PWHASH_MEMLIMIT_INTERACTIVE
);
// Schlüsselpaar aus dem abgeleiteten Seed erzeugen
$keypair = sodium_crypto_box_seed_keypair($seed);
$publicKey = sodium_crypto_box_publickey($keypair);
$secretKey = sodium_crypto_box_secretkey($keypair);
echo 'Public Key: ' . sodium_bin2base64($publicKey, SODIUM_BASE64_VARIANT_ORIGINAL) . PHP_EOL;
// Speicher sichern
sodium_memzero($password);
sodium_memzero($seed);
// Wichtig · Fallstricke
Sicherheitshinweis: Die Sicherheit des erzeugten Schlüsselpaars hängt vollständig von der Qualität des Seeds ab. Verwende niemals vorhersehbare oder schwache Seeds (z. B. feste Strings, Benutzernamen). Leite Seeds immer aus kryptografisch zufälligen Quellen oder einer starken Key-Derivation-Funktion wie sodium_crypto_pwhash ab.
Der Seed sollte nach der Nutzung mit sodium_memzero aus dem Speicher gelöscht werden, um ihn vor Auslesen zu schützen.
Da das Schlüsselpaar deterministisch ist, reicht es aus, nur den Seed sicher zu speichern – das Schlüsselpaar kann jederzeit reproduziert werden. Dies vereinfacht Key-Management, erhöht aber das Risiko, wenn der Seed kompromittiert wird.