Signatur
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
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);
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);
// 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.