Start · Sprachen · PHP · Referenz · sodium_crypto_sign_publickey

sodium_crypto_sign_publickey

Funktion

Extrahiert den öffentlichen Ed25519-Schlüssel aus einem vollständigen Schlüsselpaar.

seit PHP 7.2.0 Kategorie: crypto

Signatur

sodium_crypto_sign_publickey(string $keypair): string

Beschreibung

sodium_crypto_sign_publickey() nimmt ein vollständiges Ed25519-Schlüsselpaar (wie es z. B. von sodium_crypto_sign_keypair() oder sodium_crypto_sign_seed_keypair() erzeugt wird) entgegen und gibt ausschließlich den öffentlichen Teil zurück. Der öffentliche Schlüssel hat eine feste Länge von SODIUM_CRYPTO_SIGN_PUBLICKEYBYTES (32 Byte).

Die Funktion ist nützlich, wenn ein Schlüsselpaar generiert oder aus dem Speicher geladen wurde und der öffentliche Schlüssel separat benötigt wird – etwa um ihn an Kommunikationspartner weiterzugeben, in einer Datenbank zu speichern oder zur Signaturverifikation bereitzustellen.

Im typischen Workflow wird ein Schlüsselpaar einmalig erzeugt, der private Schlüssel sicher gespeichert, und der öffentliche Schlüssel mit sodium_crypto_sign_publickey() extrahiert und veröffentlicht. Empfänger können damit digital signierte Nachrichten mit sodium_crypto_sign_verify_detached() oder sodium_crypto_sign_open() prüfen.

Das Gegenstück für den privaten Schlüssel ist sodium_crypto_sign_secretkey(). Beide Funktionen teilen dasselbe Schlüsselpaar lediglich auf – es findet kein kryptographischer Vorgang statt.

Parameter

Name Typ Default Beschreibung
$keypair Pflicht string Ein vollständiges Ed25519-Schlüsselpaar als Binär-String, wie es von sodium_crypto_sign_keypair() oder sodium_crypto_sign_seed_keypair() zurückgegeben wird. Die Länge muss genau SODIUM_CRYPTO_SIGN_KEYPAIRBYTES (64 Byte) betragen.

Rückgabewert

Typ
string
Beschreibung
Den öffentlichen Ed25519-Schlüssel als Binär-String mit einer Länge von SODIUM_CRYPTO_SIGN_PUBLICKEYBYTES (32 Byte).

Beispiele

Schlüsselpaar erzeugen und öffentlichen Schlüssel extrahieren

<?php
// Neues Ed25519-Schlüsselpaar erzeugen
$keypair = sodium_crypto_sign_keypair();

// Öffentlichen und privaten Schlüssel trennen
$publicKey  = sodium_crypto_sign_publickey($keypair);
$secretKey  = sodium_crypto_sign_secretkey($keypair);

echo 'Öffentlicher Schlüssel (hex): ' . sodium_bin2hex($publicKey) . PHP_EOL;
echo 'Länge öffentlicher Schlüssel: ' . strlen($publicKey) . ' Byte' . PHP_EOL;

// Öffentlichen Schlüssel z. B. in Datenbank speichern
// $db->save('public_key', sodium_bin2hex($publicKey));

// Privaten Schlüssel sicher aufbewahren (nie übertragen!)
// file_put_contents('/secure/path/secret.key', $secretKey, LOCK_EX);
Öffentlicher Schlüssel (hex): <32-Byte-Hex-String> Länge öffentlicher Schlüssel: 32 Byte

Schlüssel aus Seed ableiten und zur Signatur-Verifikation nutzen

<?php
// Deterministisches Schlüsselpaar aus einem festen Seed erzeugen
$seed    = random_bytes(SODIUM_CRYPTO_SIGN_SEEDBYTES);
$keypair = sodium_crypto_sign_seed_keypair($seed);

$publicKey = sodium_crypto_sign_publickey($keypair);
$secretKey = sodium_crypto_sign_secretkey($keypair);

// Nachricht signieren
$message   = 'Wichtige Nachricht';
$signature = sodium_crypto_sign_detached($message, $secretKey);

// Signatur mit dem öffentlichen Schlüssel verifizieren
$valid = sodium_crypto_sign_verify_detached($signature, $message, $publicKey);

echo $valid ? 'Signatur gültig.' : 'Signatur UNGÜLTIG!';

// Speicher für sensible Daten bereinigen
sodium_memzero($secretKey);
Signatur gültig.

// Wichtig · Fallstricke

Sicherheitshinweise:

  • Den privaten Schlüssel ($secretKey) niemals über unsichere Kanäle übertragen oder in Logs schreiben. Nach der Verwendung mit sodium_memzero() aus dem Speicher löschen.
  • Den öffentlichen Schlüssel darf und soll man weitergeben – er ist für die Verifikation gedacht und enthält keine geheimen Informationen.
  • Das gesamte $keypair enthält sowohl den privaten als auch den öffentlichen Schlüssel; es sollte ebenfalls wie ein geheimes Datum behandelt werden.
  • Die Funktion wirft eine SodiumException, wenn der übergebene $keypair-String nicht die erwartete Länge von SODIUM_CRYPTO_SIGN_KEYPAIRBYTES hat.