Start · Sprachen · PHP · Referenz · sodium_crypto_sign_secretkey

sodium_crypto_sign_secretkey

Funktion

Extrahiert den geheimen Ed25519-Schlüssel (Secret Key) aus einem vollständigen Schlüsselpaar, das zuvor mit <code>sodium_crypto_sign_keypair()</code> erzeugt wurde.

seit PHP 7.2.0 Kategorie: crypto

Signatur

sodium_crypto_sign_secretkey(string $keypair): string

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

Typ
string
Beschreibung
Gibt den geheimen Ed25519-Schlüssel als rohen Binär-String zurück. Die Länge beträgt 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);
Secret Key Länge: 64 Byte Public Key Länge: 32 Byte Secret Key (Base64): <Base64-String>

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);
Signatur (Hex): <64-Byte-Hex-String> Signatur gültig: Ja

// 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 von SODIUM_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.