Start · Sprachen · PHP · Referenz · sodium_crypto_sign_open

sodium_crypto_sign_open

Funktion

Verifiziert eine signierte Nachricht und gibt die ursprüngliche Nachricht zurück, oder <code>false</code> bei ungültiger Signatur.

seit PHP 7.2.0 Kategorie: crypto

Signatur

sodium_crypto_sign_open(string $signed_message, string $keypair): string|false

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

Typ
string|false
Beschreibung
Gibt die ursprüngliche, unsignierte Nachricht als 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;
}
Signierte Nachricht (Länge): 108 Bytes Signatur gültig. Nachricht: Hallo, dies ist eine authentische Nachricht!

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;
}
Manipulation erkannt: Signaturprüfung fehlgeschlagen.

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