Signatur
Beschreibung
sodium_crypto_sign_keypair() generiert ein neues, kryptografisch sicheres Schlüsselpaar für das Ed25519-Signaturverfahren. Der Rückgabewert ist ein kombinierter Schlüssel-String (Keypair), der sowohl den geheimen (privaten) als auch den öffentlichen Schlüssel enthält.
Aus dem zurückgegebenen Keypair lassen sich der öffentliche Schlüssel mit sodium_crypto_sign_publickey() und der geheime Schlüssel mit sodium_crypto_sign_secretkey() extrahieren. Der geheime Schlüssel wird zum Signieren von Nachrichten verwendet (sodium_crypto_sign() oder sodium_crypto_sign_detached()), der öffentliche Schlüssel zur Verifikation.
Ed25519 ist ein modernes, schnelles und sicheres Signaturverfahren auf Basis elliptischer Kurven. Es eignet sich hervorragend für Anwendungsfälle wie JWT-Signaturen, API-Authentifizierung oder das Signieren von Software-Paketen.
Das Keypair sollte nur einmalig erzeugt, sicher gespeichert und nicht im Klartext übertragen werden. Der geheime Schlüssel muss besonders geschützt werden – er darf niemals öffentlich zugänglich sein.
Rückgabewert
SODIUM_CRYPTO_SIGN_KEYPAIRBYTES Bytes). Daraus können öffentlicher und geheimer Schlüssel separat extrahiert werden.Beispiele
Schlüsselpaar erzeugen und Schlüssel extrahieren
<?php
// Neues Schlüsselpaar erzeugen
$keypair = sodium_crypto_sign_keypair();
// Öffentlichen und geheimen Schlüssel extrahieren
$publicKey = sodium_crypto_sign_publickey($keypair);
$secretKey = sodium_crypto_sign_secretkey($keypair);
echo 'Öffentlicher Schlüssel (hex): ' . bin2hex($publicKey) . PHP_EOL;
echo 'Länge öffentlicher Schlüssel: ' . strlen($publicKey) . ' Bytes' . PHP_EOL;
echo 'Länge geheimer Schlüssel: ' . strlen($secretKey) . ' Bytes' . PHP_EOL;
// Geheimen Schlüssel sicher aus dem Speicher löschen
sodium_memzero($keypair);
sodium_memzero($secretKey);
Nachricht signieren und Signatur verifizieren
<?php
// Schlüsselpaar erzeugen
$keypair = sodium_crypto_sign_keypair();
$publicKey = sodium_crypto_sign_publickey($keypair);
$secretKey = sodium_crypto_sign_secretkey($keypair);
$message = 'Wichtige Nachricht, die signiert werden soll.';
// Nachricht mit geheimem Schlüssel signieren (detached = nur Signatur)
$signature = sodium_crypto_sign_detached($message, $secretKey);
// Signatur mit öffentlichem Schlüssel verifizieren
$valid = sodium_crypto_sign_verify_detached($signature, $message, $publicKey);
if ($valid) {
echo 'Signatur gültig – Nachricht authentisch.' . PHP_EOL;
} else {
echo 'Signatur ungültig!' . PHP_EOL;
}
// Manipulation simulieren
$tampered = $message . 'X';
$valid2 = sodium_crypto_sign_verify_detached($signature, $tampered, $publicKey);
echo 'Manipulierte Nachricht gültig: ' . ($valid2 ? 'ja' : 'nein') . PHP_EOL;
sodium_memzero($secretKey);
// Wichtig · Fallstricke
Sicherheitshinweis: Den geheimen Schlüssel niemals im Klartext in Datenbanken, Logs oder Versionskontrollsystemen speichern. Er sollte verschlüsselt abgelegt werden, z. B. mit sodium_crypto_secretbox() oder in einem Hardware-Sicherheitsmodul (HSM).
Nach der Verwendung des geheimen Schlüssels im Speicher empfiehlt es sich, diesen mit sodium_memzero() zu überschreiben, um den Zeitraum der Exposition zu minimieren.
Das Schlüsselpaar sollte nur einmal erzeugt und dann dauerhaft gespeichert werden – ein neues Keypair bei jedem Aufruf zu erzeugen ist typischerweise ein Design-Fehler.