Signatur
Beschreibung
sodium_crypto_sign_secretkey() extrahiert den privaten (geheimen) Teil aus einem Ed25519-Schlüsselpaar. Ein solches Schlüsselpaar wird typischerweise mit sodium_crypto_sign_keypair() oder sodium_crypto_sign_keypair_from_secretkey_and_publickey() erzeugt und enthält sowohl den öffentlichen als auch den privaten Schlüssel als zusammengesetzten Binär-String.
Der zurückgegebene Secret Key hat eine Länge von SODIUM_CRYPTO_SIGN_SECRETKEYBYTES (64 Byte). Er wird benötigt, um mit sodium_crypto_sign() oder sodium_crypto_sign_detached() eine digitale Signatur zu erstellen. Der Secret Key darf niemals öffentlich weitergegeben werden – er ist ausschließlich für den signierenden Teilnehmer bestimmt.
Diese Funktion ist Teil der Libsodium-Erweiterung, die seit PHP 7.2 fest in den Kern integriert ist. Für ältere PHP-Versionen steht die PECL-Extension libsodium zur Verfügung. Alle Libsodium-Operationen arbeiten mit binären Zeichenketten; für Speicherung oder Übertragung empfiehlt sich Base64-Kodierung via sodium_bin2base64().
Der Secret Key sollte nach der Verwendung mit sodium_memzero() aus dem Speicher gelöscht werden, um ihn vor Speicheranalyse-Angriffen zu schützen.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $keypair Pflicht | string | Das vollständige Ed25519-Schlüsselpaar als Binär-String (128 Byte), wie es von sodium_crypto_sign_keypair() zurückgegeben wird. Es enthält sowohl den öffentlichen als auch den geheimen Schlüssel. |
Rückgabewert
SODIUM_CRYPTO_SIGN_SECRETKEYBYTES (64 Byte). Im Fehlerfall wird eine SodiumException ausgeworfen.Beispiele
Schlüsselpaar erzeugen und Secret Key extrahieren
<?php
// Neues Ed25519-Schlüsselpaar generieren
$keypair = sodium_crypto_sign_keypair();
// Geheimen Schlüssel extrahieren
$secretKey = sodium_crypto_sign_secretkey($keypair);
// Öffentlichen Schlüssel extrahieren
$publicKey = sodium_crypto_sign_publickey($keypair);
echo 'Secret Key Länge: ' . strlen($secretKey) . ' Byte' . PHP_EOL;
echo 'Public Key Länge: ' . strlen($publicKey) . ' Byte' . PHP_EOL;
// Secret Key Base64-kodiert (z. B. zur sicheren Speicherung)
$secretKeyB64 = sodium_bin2base64($secretKey, SODIUM_BASE64_VARIANT_ORIGINAL);
echo 'Secret Key (Base64): ' . $secretKeyB64 . PHP_EOL;
// Schlüssel sicher aus dem Speicher löschen
sodium_memzero($secretKey);
sodium_memzero($keypair);
Nachricht signieren mit extrahiertem Secret Key
<?php
// Schlüsselpaar laden (hier beispielhaft neu erzeugt)
$keypair = sodium_crypto_sign_keypair();
$secretKey = sodium_crypto_sign_secretkey($keypair);
$publicKey = sodium_crypto_sign_publickey($keypair);
$message = 'Dies ist eine wichtige Nachricht.';
// Abgetrennte Signatur erstellen
$signature = sodium_crypto_sign_detached($message, $secretKey);
echo 'Signatur (Hex): ' . sodium_bin2hex($signature) . PHP_EOL;
// Signatur auf Empfängerseite verifizieren
$valid = sodium_crypto_sign_verify_detached($signature, $message, $publicKey);
echo 'Signatur gültig: ' . ($valid ? 'Ja' : 'Nein') . PHP_EOL;
// Schlüssel sicher löschen
sodium_memzero($secretKey);
sodium_memzero($keypair);
// Wichtig · Fallstricke
Sicherheitshinweise:
- Der geheime Schlüssel darf niemals öffentlich weitergegeben, in Logs geschrieben oder unsicher gespeichert werden.
- Nach der Verwendung sollte der Secret Key mit
sodium_memzero()aus dem Arbeitsspeicher gelöscht werden, um Angriffe über Speicheranalyse (z. B. Core Dumps) zu erschweren. - Für die persistente Speicherung empfiehlt sich ein sicheres Key-Management (z. B. verschlüsselte Konfigurationsdateien, Hardware-Security-Module oder Umgebungsvariablen).
- Die Funktion wirft eine
SodiumException, wenn der übergebene$keypair-String nicht die erwartete Länge vonSODIUM_CRYPTO_SIGN_KEYPAIRBYTES(128 Byte) hat. - Der zurückgegebene Secret Key enthält in der Libsodium-Implementierung sowohl den eigentlichen privaten Schlüssel (32 Byte Seed) als auch den öffentlichen Schlüssel (32 Byte), zusammen 64 Byte – dies ist das interne Format von Ed25519.