Signatur
Beschreibung
sodium_crypto_sign_keypair_from_secretkey_and_publickey() rekonstruiert ein vollständiges Schlüsselpaar für die digitale Signatur (Ed25519), indem es einen bereits vorhandenen geheimen Schlüssel (Secret Key) und den zugehörigen öffentlichen Schlüssel (Public Key) zu einer einzigen Zeichenkette zusammenfügt. Das resultierende Schlüsselpaar kann anschließend direkt mit Funktionen wie sodium_crypto_sign() oder sodium_crypto_sign_detached() verwendet werden.
Diese Funktion ist besonders nützlich, wenn geheimer und öffentlicher Schlüssel getrennt gespeichert oder übertragen wurden und wieder zu einem kombinierten Schlüsselpaar zusammengeführt werden müssen. Typischerweise wird der geheime Schlüssel sicher in einer Datenbank oder einem Key-Store abgelegt, während der öffentliche Schlüssel frei verteilt werden darf. Vor einer Signieroperation werden beide mit dieser Funktion zusammengeführt.
Wichtig: Der übergebene $secretkey muss ein valider Ed25519-Geheimschlüssel sein, der üblicherweise 64 Bytes lang ist (in Natriums Darstellung enthält er den 32-Byte-Seed sowie den 32-Byte-Public-Key-Anteil). Der $publickey hat eine Länge von 32 Bytes. Beide Schlüssel müssen zusammenpassen – ein Mismatch führt zwar nicht zwingend zu einem Fehler, jedoch zu einer ungültigen Signatur.
Die Funktion führt keine kryptografische Ableitung durch, sondern konkateniert die Schlüssel lediglich zu einem Format, das von den Signatur-Funktionen der libsodium erwartet wird.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $secretkey Pflicht | string | Der geheime Ed25519-Schlüssel (64 Bytes). Kann mit sodium_crypto_sign_keypair() erzeugt und anschließend mit sodium_crypto_sign_secretkey() extrahiert werden. |
|
| $publickey Pflicht | string | Der öffentliche Ed25519-Schlüssel (32 Bytes). Korrespondiert mit dem geheimen Schlüssel und kann mit sodium_crypto_sign_publickey() aus einem Schlüsselpaar extrahiert werden. |
Rückgabewert
sodium_crypto_sign() verwendet werden kann.Beispiele
Schlüsselpaar trennen und wiederherstellen
<?php
// Schlüsselpaar erzeugen
$keypair = sodium_crypto_sign_keypair();
// Schlüssel extrahieren und (z. B. in DB) speichern
$secretkey = sodium_crypto_sign_secretkey($keypair);
$publickey = sodium_crypto_sign_publickey($keypair);
// Geheimen Schlüssel sicher kodieren (z. B. für Datenbankablage)
$secretkeyEncoded = sodium_bin2base64($secretkey, SODIUM_BASE64_VARIANT_ORIGINAL);
$publickeyEncoded = sodium_bin2base64($publickey, SODIUM_BASE64_VARIANT_ORIGINAL);
// --- Später, bei Verwendung ---
$secretkeyRestored = sodium_base642bin($secretkeyEncoded, SODIUM_BASE64_VARIANT_ORIGINAL);
$publickeyRestored = sodium_base642bin($publickeyEncoded, SODIUM_BASE64_VARIANT_ORIGINAL);
// Schlüsselpaar rekonstruieren
$restoredKeypair = sodium_crypto_sign_keypair_from_secretkey_and_publickey(
$secretkeyRestored,
$publickeyRestored
);
// Nachricht signieren
$message = 'Wichtige Nachricht';
$signed = sodium_crypto_sign($message, $restoredKeypair);
// Signatur verifizieren
$verified = sodium_crypto_sign_open($signed, $publickeyRestored);
echo $verified; // Wichtige Nachricht
Signatur-Workflow mit getrennter Schlüsselverwaltung
<?php
// Einmalig: Schlüsselpaar erzeugen und Schlüssel getrennt sichern
$keypair = sodium_crypto_sign_keypair();
$secretkey = sodium_crypto_sign_secretkey($keypair);
$publickey = sodium_crypto_sign_publickey($keypair);
// Schlüssel in Dateien speichern (Secret Key nur serverseitig!)
file_put_contents('/secure/secret.key', $secretkey);
file_put_contents('/public/public.key', $publickey);
// --- Signierung ---
$secretkeyLoaded = file_get_contents('/secure/secret.key');
$publickeyLoaded = file_get_contents('/public/public.key');
$keypairReconstructed = sodium_crypto_sign_keypair_from_secretkey_and_publickey(
$secretkeyLoaded,
$publickeyLoaded
);
$message = 'Zu signierende Daten';
$signature = sodium_crypto_sign_detached($message, $keypairReconstructed);
// Verifikation mit öffentlichem Schlüssel
$valid = sodium_crypto_sign_verify_detached($signature, $message, $publickeyLoaded);
var_dump($valid);
// Wichtig · Fallstricke
Sicherheitshinweis: Der geheime Schlüssel darf niemals in unsicheren Umgebungen gespeichert, übertragen oder protokolliert werden. Verwende zum Schutz des gespeicherten Schlüssels eine sichere Ablage (z. B. Hardware Security Module, verschlüsselter Key-Store oder Betriebssystem-Credential-Store).
Achtung bei Schlüssel-Mismatch: Die Funktion prüft nicht, ob geheimer und öffentlicher Schlüssel mathematisch zusammenpassen. Ein Mismatch führt zu Signaturen, die bei der Verifikation fehlschlagen. Stelle sicher, dass beide Schlüssel aus demselben sodium_crypto_sign_keypair()-Aufruf stammen.
Nach Verwendung des Schlüsselmaterials sollten sensible Strings mit sodium_memzero() aus dem Speicher gelöscht werden, um Speicher-Dumps zu erschweren.