Signatur
Beschreibung
sodium_crypto_sign_open prüft die Ed25519-Signatur einer signierten Nachricht, die zuvor mit sodium_crypto_sign erzeugt wurde. Ist die Signatur gültig, wird die ursprüngliche, unsignierte Nachricht zurückgegeben; andernfalls gibt die Funktion false zurück.
Die Funktion erwartet als zweiten Parameter das öffentliche Schlüsselpaar (Public Key), das mit sodium_crypto_sign_publickey aus einem Keypair extrahiert werden kann. Nur der öffentliche Schlüssel wird zur Verifikation benötigt – der private Schlüssel bleibt geheim beim Unterzeichner.
Diese Funktion gehört zum sign-and-verify-Muster der libsodium-Bibliothek: Eine Partei signiert eine Nachricht mit ihrem privaten Schlüssel (sodium_crypto_sign), eine andere Partei verifiziert die Echtheit und Integrität mit dem öffentlichen Schlüssel (sodium_crypto_sign_open). Dadurch wird sichergestellt, dass die Nachricht tatsächlich vom Besitzer des privaten Schlüssels stammt und auf dem Übertragungsweg nicht verändert wurde.
Im Gegensatz zu sodium_crypto_sign_verify_detached arbeitet diese Funktion mit dem kombinierten Format, bei dem Signatur und Nachricht gemeinsam als ein einzelner Binärstring übertragen werden.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $signed_message Pflicht | string | Die signierte Nachricht im kombinierten Format, bestehend aus einer 64-Byte-Signatur gefolgt von der eigentlichen Nachricht. Wird typischerweise durch sodium_crypto_sign erzeugt. |
|
| $keypair Pflicht | string | Der öffentliche Schlüssel des Unterzeichners. Muss mit sodium_crypto_sign_publickey aus einem Keypair extrahiert oder direkt als 32-Byte-Ed25519-Public-Key übergeben werden. |
Rückgabewert
string zurück, wenn die Signatur gültig ist. Gibt false zurück, wenn die Signatur ungültig ist oder die Nachricht manipuliert wurde.Beispiele
Nachricht signieren und Signatur verifizieren
<?php
// Schlüsselpaar erzeugen (einmalig, privaten Schlüssel sicher speichern)
$keypair = sodium_crypto_sign_keypair();
$privateKey = sodium_crypto_sign_secretkey($keypair);
$publicKey = sodium_crypto_sign_publickey($keypair);
// Nachricht signieren
$message = 'Hallo, dies ist eine authentische Nachricht!';
$signedMessage = sodium_crypto_sign($message, $privateKey);
echo 'Signierte Nachricht (Länge): ' . strlen($signedMessage) . ' Bytes' . PHP_EOL;
// Signatur prüfen und ursprüngliche Nachricht extrahieren
$verified = sodium_crypto_sign_open($signedMessage, $publicKey);
if ($verified === false) {
echo 'Signaturprüfung fehlgeschlagen!' . PHP_EOL;
} else {
echo 'Signatur gültig. Nachricht: ' . $verified . PHP_EOL;
}
Manipulation erkennen – manipulierte Nachricht wird abgelehnt
<?php
$keypair = sodium_crypto_sign_keypair();
$privateKey = sodium_crypto_sign_secretkey($keypair);
$publicKey = sodium_crypto_sign_publickey($keypair);
$original = 'Originalnachricht';
$signedMessage = sodium_crypto_sign($original, $privateKey);
// Nachricht mutwillig verändern (letztes Zeichen überschreiben)
$tampered = $signedMessage;
$tampered[strlen($tampered) - 1] = chr(ord($tampered[strlen($tampered) - 1]) ^ 0xFF);
$result = sodium_crypto_sign_open($tampered, $publicKey);
if ($result === false) {
echo 'Manipulation erkannt: Signaturprüfung fehlgeschlagen.' . PHP_EOL;
} else {
echo 'Nachricht akzeptiert: ' . $result . PHP_EOL;
}
// Wichtig · Fallstricke
Sicherheitshinweis: Der Rückgabewert false muss mit striktem Vergleich (=== false) geprüft werden, da eine leere Nachricht als leerer String zurückgegeben wird, der bei losem Vergleich (== false) fälschlicherweise als fehlgeschlagen interpretiert würde.
Schlüsselformat: Der zweite Parameter erwartet ausschließlich den öffentlichen Schlüssel (32 Bytes), nicht das vollständige Keypair. Verwende sodium_crypto_sign_publickey zur Extraktion. Das versehentliche Übergeben des privaten Schlüssels führt zu einem Fehler oder falschen Ergebnissen.
Kombiniertes Format: Diese Funktion erwartet das kombinierte Format (Signatur + Nachricht). Liegt die Signatur separat vor, muss stattdessen sodium_crypto_sign_verify_detached verwendet werden.
Sensible Schlüsselmaterialien sollten nach Verwendung mit sodium_memzero aus dem Speicher gelöscht werden, um Angriffe über Speicher-Dumps zu erschweren.