Signatur
Beschreibung
Die Funktion sodium_crypto_sign_publickey_from_secretkey() leitet aus einem 64-Byte langen geheimen Ed25519-Schlüssel den zugehörigen 32-Byte langen öffentlichen Schlüssel ab. Dies ermöglicht es, den öffentlichen Schlüssel jederzeit reproduzierbar aus dem geheimen Schlüssel zu rekonstruieren, ohne das ursprüngliche Schlüsselpaar erneut erzeugen zu müssen.
Typischer Anwendungsfall ist die Situation, in der nur der geheime Schlüssel sicher gespeichert wurde und der öffentliche Schlüssel zur Verifikation von Signaturen benötigt wird. Dies spart Speicherplatz, da nicht beide Schlüssel separat persistiert werden müssen.
Der geheime Schlüssel muss zuvor mit sodium_crypto_sign_keypair() oder sodium_crypto_sign_seed_keypair() erzeugt und anschließend über sodium_crypto_sign_secretkey() extrahiert worden sein. Ein ungültiger oder falscher Schlüssel führt zu einem Fehler.
Diese Funktion ist Teil der libsodium-Bibliothek, die in PHP ab Version 7.2 nativ integriert ist und moderne, sichere kryptographische Primitiven bereitstellt.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $secret_key Pflicht | string | Der geheime Ed25519-Schlüssel mit einer Länge von SODIUM_CRYPTO_SIGN_SECRETKEYBYTES (64 Byte), der zuvor mit sodium_crypto_sign_secretkey() aus einem Schlüsselpaar extrahiert wurde. |
Rückgabewert
SODIUM_CRYPTO_SIGN_PUBLICKEYBYTES (32 Byte) zurück.Beispiele
Öffentlichen Schlüssel aus gespeichertem geheimen Schlüssel rekonstruieren
<?php
// Schlüsselpaar erzeugen
$keypair = sodium_crypto_sign_keypair();
// Geheimen Schlüssel extrahieren und (z. B. in Datenbank) speichern
$secretKey = sodium_crypto_sign_secretkey($keypair);
// Später: öffentlichen Schlüssel aus dem geheimen Schlüssel ableiten
$publicKey = sodium_crypto_sign_publickey_from_secretkey($secretKey);
// Zur Verifikation nutzen
$message = 'Hallo Welt!';
$signature = sodium_crypto_sign_detached($message, $secretKey);
if (sodium_crypto_sign_verify_detached($signature, $message, $publicKey)) {
echo 'Signatur gültig.' . PHP_EOL;
} else {
echo 'Signatur ungültig!' . PHP_EOL;
}
// Sicherheitshalber geheimen Schlüssel aus dem Speicher löschen
sodium_memzero($secretKey);
Vergleich des abgeleiteten mit dem originalen öffentlichen Schlüssel
<?php
// Schlüsselpaar erzeugen
$keypair = sodium_crypto_sign_keypair();
$originalPublicKey = sodium_crypto_sign_publickey($keypair);
$secretKey = sodium_crypto_sign_secretkey($keypair);
// Öffentlichen Schlüssel aus geheimem Schlüssel ableiten
$derivedPublicKey = sodium_crypto_sign_publickey_from_secretkey($secretKey);
// Beide sollten identisch sein
if (hash_equals($originalPublicKey, $derivedPublicKey)) {
echo 'Abgeleiteter Schlüssel stimmt mit dem Original überein.' . PHP_EOL;
} else {
echo 'Schlüssel stimmen NICHT überein!' . PHP_EOL;
}
sodium_memzero($secretKey);
// Wichtig · Fallstricke
Sicherheitshinweis: Der geheime Schlüssel sollte nach der Verwendung mit sodium_memzero() aus dem Arbeitsspeicher gelöscht werden, um zu verhindern, dass er bei einem Speicherdump kompromittiert werden kann.
Die Funktion wirft eine SodiumException, wenn die Länge des übergebenen $secret_key nicht exakt SODIUM_CRYPTO_SIGN_SECRETKEYBYTES (64 Byte) beträgt. Stellen Sie sicher, dass der Schlüssel immer mit den korrekten libsodium-Funktionen erzeugt wurde.
Verwechseln Sie den Ed25519-Schlüssel nicht mit einem X25519-Schlüssel (für Diffie-Hellman). Für die Konvertierung eines Ed25519-Schlüssels in einen X25519-Schlüssel stehen separate Funktionen wie sodium_crypto_sign_ed25519_sk_to_curve25519() zur Verfügung.