Start · Sprachen · PHP · Referenz · sodium_crypto_sign_detached

sodium_crypto_sign_detached

Funktion

Erstellt eine abgetrennte Ed25519-Signatur für eine Nachricht, ohne die Nachricht selbst in die Ausgabe einzubetten.

seit PHP 7.2.0 Kategorie: crypto

Signatur

sodium_crypto_sign_detached(string $message, string $secret_key): string

Beschreibung

sodium_crypto_sign_detached() erzeugt eine kryptografische Signatur für eine beliebige Nachricht mithilfe des Ed25519-Algorithmus. Im Gegensatz zu sodium_crypto_sign() wird die Nachricht nicht in die Ausgabe eingebettet – es wird lediglich die rohe Signatur (64 Bytes) zurückgegeben. Diese kann separat übertragen und später mit dem zugehörigen öffentlichen Schlüssel verifiziert werden.

Dieses Verfahren eignet sich hervorragend für Protokolle, in denen Nachricht und Signatur getrennt gespeichert oder übertragen werden sollen, z. B. bei der Signierung von API-Anfragen, Software-Paketen oder Tokens, wenn das Format des Nachrichteninhalts nicht verändert werden darf.

Der geheime Schlüssel ($secret_key) muss 64 Bytes lang sein und kann mit sodium_crypto_sign_keypair() oder sodium_crypto_sign_seed_keypair() erzeugt werden. Mit sodium_crypto_sign_secretkey() wird er aus einem Schlüsselpaar extrahiert.

Zur Verifikation einer abgetrennten Signatur wird die Funktion sodium_crypto_sign_verify_detached() zusammen mit dem öffentlichen Schlüssel verwendet.

Parameter

Name Typ Default Beschreibung
$message Pflicht string Die zu signierende Nachricht als binärer oder textueller String. Die Nachricht selbst wird nicht verändert oder in die Ausgabe eingebettet.
$secret_key Pflicht string Der geheime 64-Byte-Signaturschlüssel (Ed25519). Er wird mit sodium_crypto_sign_keypair() generiert und mittels sodium_crypto_sign_secretkey() aus dem Schlüsselpaar extrahiert.

Rückgabewert

Typ
string
Beschreibung
Gibt die rohe Signatur als binären String mit exakt 64 Bytes (SODIUM_CRYPTO_SIGN_BYTES) zurück. Bei einem Fehler wird eine SodiumException geworfen.

Beispiele

Signatur erstellen und verifizieren

<?php
// Schlüsselpaar erzeugen
$keypair    = sodium_crypto_sign_keypair();
$secretKey  = sodium_crypto_sign_secretkey($keypair);
$publicKey  = sodium_crypto_sign_publickey($keypair);

$message = 'Wichtige Nachricht, die signiert werden soll.';

// Abgetrennte Signatur erstellen
$signature = sodium_crypto_sign_detached($message, $secretKey);

echo 'Signaturlänge: ' . strlen($signature) . ' Bytes' . PHP_EOL; // 64 Bytes

// Signatur verifizieren
$valid = sodium_crypto_sign_verify_detached($signature, $message, $publicKey);

if ($valid) {
    echo 'Signatur ist gültig.' . PHP_EOL;
} else {
    echo 'Signatur ist UNGÜLTIG!' . PHP_EOL;
}

// Speicher für sensible Daten bereinigen
sodium_memzero($secretKey);
Signaturlänge: 64 Bytes Signatur ist gültig.

API-Anfrage mit Signatur absichern

<?php
// Schlüsselpaar aus einem deterministischen Seed erzeugen
$seed      = random_bytes(SODIUM_CRYPTO_SIGN_SEEDBYTES);
$keypair   = sodium_crypto_sign_seed_keypair($seed);
$secretKey = sodium_crypto_sign_secretkey($keypair);
$publicKey = sodium_crypto_sign_publickey($keypair);

// Nutzdaten der API-Anfrage
$payload = json_encode([
    'action'    => 'transfer',
    'amount'    => 150.00,
    'timestamp' => time(),
]);

// Signatur erzeugen und Base64-kodiert übertragen
$signature = sodium_crypto_sign_detached($payload, $secretKey);
$signatureB64 = base64_encode($signature);

echo 'Payload: '    . $payload      . PHP_EOL;
echo 'Signatur (Base64): ' . $signatureB64 . PHP_EOL;

// Empfängerseite: Signatur verifizieren
$receivedSig = base64_decode($signatureB64);
$ok = sodium_crypto_sign_verify_detached($receivedSig, $payload, $publicKey);
echo $ok ? 'Anfrage authentisch.' : 'Anfrage manipuliert!';

sodium_memzero($secretKey);
Payload: {"action":"transfer","amount":150,"timestamp":...} Signatur (Base64): <64-Byte-Ed25519-Signatur als Base64> Anfrage authentisch.

// Wichtig · Fallstricke

Sicherheitshinweise:

  • Der geheime Schlüssel muss streng vertraulich behandelt werden. Verwende sodium_memzero(), um ihn nach Gebrauch aus dem Speicher zu löschen.
  • Ed25519-Signaturen bieten keine Verschlüsselung – die Nachricht bleibt im Klartext. Für vertrauliche Daten ist eine separate Verschlüsselung erforderlich (z. B. sodium_crypto_secretbox()).
  • Die Funktion wirft eine SodiumException, wenn der Schlüssel die falsche Länge hat. Prüfe daher die Schlüssellänge (SODIUM_CRYPTO_SIGN_SECRETKEYBYTES = 64).
  • Signaturen sollten immer zusammen mit einem Timestamp oder einer Nonce verwendet werden, um Replay-Angriffe zu verhindern.