Start · Sprachen · PHP · Referenz · sodium_crypto_sign_keypair

sodium_crypto_sign_keypair

Funktion

Erzeugt ein zufälliges Ed25519-Schlüsselpaar (geheimer + öffentlicher Schlüssel) für digitale Signaturen.

seit PHP 7.2.0 Kategorie: crypto

Signatur

sodium_crypto_sign_keypair(): string

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

Typ
string
Beschreibung
Gibt einen binären String zurück, der das vollständige Ed25519-Schlüsselpaar enthält (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);
Öffentlicher Schlüssel (hex): <32-Byte-Hex-String> Länge öffentlicher Schlüssel: 32 Bytes Länge geheimer Schlüssel: 64 Bytes

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);
Signatur gültig – Nachricht authentisch. Manipulierte Nachricht gültig: nein

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