Start · Sprachen · PHP · Referenz · sodium_crypto_sign_seed_keypair

sodium_crypto_sign_seed_keypair

Funktion

Leitet ein deterministisches Ed25519-Schlüsselpaar aus einem 32-Byte-Seed ab und gibt es als kombiniertes Keypair-String zurück.

seit PHP 7.2.0 Kategorie: crypto

Signatur

sodium_crypto_sign_seed_keypair(string $seed): string

Beschreibung

sodium_crypto_sign_seed_keypair() erzeugt ein Ed25519-Schlüsselpaar (öffentlicher + privater Schlüssel) deterministisch aus einem einzelnen 32-Byte-Seed. Da das Ergebnis vollständig vom Seed abhängt, lässt sich dasselbe Schlüsselpaar jederzeit reproduzieren – solange der Seed bekannt ist.

Dies ist besonders nützlich, wenn Schlüsselpaare aus einem Master-Seed (z. B. eines CSPRNG oder einer KDF wie sodium_crypto_pwhash()) abgeleitet werden sollen, ohne den vollen Keypair-Blob dauerhaft speichern zu müssen. Man speichert nur den Seed und kann den Rest jederzeit neu erzeugen.

Das zurückgegebene Keypair ist ein binärer String, der sowohl den privaten als auch den öffentlichen Schlüssel enthält. Die einzelnen Teile werden mit sodium_crypto_sign_secretkey() bzw. sodium_crypto_sign_publickey() extrahiert. Der Keypair-String darf danach mit sodium_crypto_sign() oder sodium_crypto_sign_detached() verwendet werden.

Im Gegensatz zu sodium_crypto_sign_keypair(), das einen zufälligen Schlüssel erzeugt, liefert diese Funktion bei gleichem Seed stets dasselbe Ergebnis – ein wichtiges Merkmal für deterministische Signatursysteme und hierarchische Schlüsselableitungen.

Parameter

Name Typ Default Beschreibung
$seed Pflicht string Ein binärer String mit genau SODIUM_CRYPTO_SIGN_SEEDBYTES (32) Bytes. Wird als deterministischer Eingabewert für die Schlüsselableitung verwendet. Muss kryptografisch zufällig und geheim gehalten werden.

Rückgabewert

Typ
string
Beschreibung
Ein binärer String der Länge SODIUM_CRYPTO_SIGN_KEYPAIRBYTES (96 Bytes), der den privaten und den öffentlichen Schlüssel kombiniert enthält. Bei ungültiger Seedlänge wird eine SodiumException ausgelöst.

Beispiele

Schlüsselpaar aus Seed ableiten und Nachricht signieren

<?php
// Seed: exakt 32 Bytes (z. B. aus einem CSPRNG oder einer KDF)
$seed = random_bytes(SODIUM_CRYPTO_SIGN_SEEDBYTES);

// Keypair deterministisch ableiten
$keypair = sodium_crypto_sign_seed_keypair($seed);

// Schlüssel extrahieren
$secretKey = sodium_crypto_sign_secretkey($keypair);
$publicKey = sodium_crypto_sign_publickey($keypair);

$message = 'Wichtige Nachricht';

// Signatur erstellen
$signed = sodium_crypto_sign($message, $secretKey);

// Signatur verifizieren
$verified = sodium_crypto_sign_open($signed, $publicKey);

if ($verified === false) {
    echo 'Signatur ungültig!';
} else {
    echo 'Verifizierte Nachricht: ' . $verified;
}

// Seed und sensible Schlüssel sicher löschen
sodium_memzero($seed);
sodium_memzero($secretKey);
sodium_memzero($keypair);
Verifizierte Nachricht: Wichtige Nachricht

Reproduzierbares Schlüsselpaar aus Passwort ableiten

<?php
$password = 'Mein-sicheres-Passwort';
$salt     = random_bytes(SODIUM_CRYPTO_PWHASH_SALTBYTES);

// Seed aus Passwort ableiten (KDF)
$seed = sodium_crypto_pwhash(
    SODIUM_CRYPTO_SIGN_SEEDBYTES,
    $password,
    $salt,
    SODIUM_CRYPTO_PWHASH_OPSLIMIT_INTERACTIVE,
    SODIUM_CRYPTO_PWHASH_MEMLIMIT_INTERACTIVE
);

// Deterministisches Keypair
$keypair   = sodium_crypto_sign_seed_keypair($seed);
$publicKey = sodium_crypto_sign_publickey($keypair);

echo 'Öffentlicher Schlüssel (hex): ' . sodium_bin2hex($publicKey);

// Seed sicher löschen
sodium_memzero($seed);
sodium_memzero($keypair);

// Wichtig · Fallstricke

Seedlänge prüfen: Der Seed muss exakt SODIUM_CRYPTO_SIGN_SEEDBYTES (32) Bytes lang sein. Eine falsche Länge wirft eine SodiumException.

Seed-Sicherheit: Wer den Seed kennt, kann den privaten Schlüssel jederzeit rekonstruieren. Der Seed muss daher wie ein privater Schlüssel behandelt und niemals öffentlich zugänglich gemacht werden.

Sensible Daten löschen: Nach der Verwendung sollten Seed und Keypair mit sodium_memzero() aus dem Speicher gelöscht werden, um die Exposition gegenüber Memory-Dumps zu reduzieren.

Keine Zufälligkeit: Im Gegensatz zu sodium_crypto_sign_keypair() erzeugt diese Funktion keinen zufälligen Schlüssel – ein schwacher oder wiederverwendeter Seed führt unmittelbar zu unsicheren Schlüsseln.