Start · Sprachen · PHP · Referenz · sodium_crypto_sign_verify_detached

sodium_crypto_sign_verify_detached

Funktion

Prüft eine Ed25519-Detachsignatur einer Nachricht anhand eines öffentlichen Schlüssels und gibt <code>true</code> zurück, wenn die Signatur gültig ist.

seit PHP 7.2.0 Kategorie: crypto

Signatur

sodium_crypto_sign_verify_detached(string $signature, string $message, string $public_key): bool

Beschreibung

sodium_crypto_sign_verify_detached() verifiziert eine abgetrennte (detached) Signatur, die zuvor mit sodium_crypto_sign_detached() erzeugt wurde. Bei abgetrennten Signaturen wird die Signatur separat von der eigentlichen Nachricht gespeichert – dies ist nützlich, wenn Nachricht und Signatur unabhängig voneinander übertragen oder gespeichert werden sollen.

Die Funktion basiert auf dem Ed25519-Algorithmus (Edwards-Curve Digital Signature Algorithm), einem modernen, schnellen und sicheren Signaturverfahren aus der libsodium-Bibliothek. Der öffentliche Schlüssel muss exakt 32 Byte lang sein und sollte mit sodium_crypto_sign_keypair() oder sodium_crypto_sign_publickey() erzeugt worden sein.

Im Gegensatz zur kombinierten Variante sodium_crypto_sign_open() gibt diese Funktion nur ein boolesches Ergebnis zurück und lässt die Nachricht unverändert. Sie eignet sich besonders dann, wenn die Nachrichtenintegrität und Authentizität geprüft werden soll, ohne die Nachricht erneut aus der signierten Form zu extrahieren.

Timing-sichere Vergleiche werden intern durch libsodium gewährleistet, sodass keine Anfälligkeit gegenüber Timing-Angriffen besteht.

Parameter

Name Typ Default Beschreibung
$signature Pflicht string Die zu prüfende Signatur als binärer String. Muss exakt 64 Byte lang sein (Ed25519-Signatur), wie sie von sodium_crypto_sign_detached() erzeugt wird.
$message Pflicht string Die Originalnachricht (beliebiger binärer oder Text-String), deren Authentizität überprüft werden soll.
$public_key Pflicht string Der öffentliche Ed25519-Schlüssel als binärer String (genau 32 Byte), der zum privaten Schlüssel gehört, mit dem die Signatur erstellt wurde. Kann mit sodium_crypto_sign_publickey() aus einem Schlüsselpaar extrahiert werden.

Rückgabewert

Typ
bool
Beschreibung
Gibt true zurück, wenn die Signatur gültig ist und die Nachricht authentisch ist. Gibt false zurück, wenn die Signatur ungültig ist, die Nachricht manipuliert wurde oder der falsche öffentliche Schlüssel verwendet wurde.

Beispiele

Signatur erstellen und verifizieren

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

$message = 'Das ist eine wichtige Nachricht.';

// Detachsignatur erzeugen
$signature = sodium_crypto_sign_detached($message, $privateKey);

echo 'Signaturlänge: ' . strlen($signature) . ' Byte' . PHP_EOL;

// Signatur verifizieren
if (sodium_crypto_sign_verify_detached($signature, $message, $publicKey)) {
    echo 'Signatur ist gültig – Nachricht authentisch.' . PHP_EOL;
} else {
    echo 'Signatur ungültig – Nachricht manipuliert oder falscher Schlüssel!' . PHP_EOL;
}

// Nachricht manipulieren und erneut prüfen
$manipulatedMessage = 'Das ist eine veränderte Nachricht.';
if (sodium_crypto_sign_verify_detached($signature, $manipulatedMessage, $publicKey)) {
    echo 'Signatur ist gültig.' . PHP_EOL;
} else {
    echo 'Signatur ungültig – Manipulation erkannt.' . PHP_EOL;
}
Signaturlänge: 64 Byte Signatur ist gültig – Nachricht authentisch. Signatur ungültig – Manipulation erkannt.

Signatur und öffentlichen Schlüssel aus Datei laden

<?php
// Öffentlichen Schlüssel und Signatur aus Dateien laden (hex-kodiert gespeichert)
$publicKeyHex = file_get_contents('/pfad/zu/public.key');
$signatureHex = file_get_contents('/pfad/zu/nachricht.sig');
$message      = file_get_contents('/pfad/zu/nachricht.txt');

$publicKey = sodium_hex2bin(trim($publicKeyHex));
$signature = sodium_hex2bin(trim($signatureHex));

if (strlen($publicKey) !== SODIUM_CRYPTO_SIGN_PUBLICKEYBYTES) {
    throw new RuntimeException('Ungültige Länge des öffentlichen Schlüssels.');
}

if (strlen($signature) !== SODIUM_CRYPTO_SIGN_BYTES) {
    throw new RuntimeException('Ungültige Signaturlänge.');
}

if (sodium_crypto_sign_verify_detached($signature, $message, $publicKey)) {
    echo 'Nachricht ist authentisch und unverändert.' . PHP_EOL;
} else {
    echo 'Verifikation fehlgeschlagen – Datei möglicherweise manipuliert.' . PHP_EOL;
}

// Wichtig · Fallstricke

Sicherheitshinweise:

  • Stelle sicher, dass der öffentliche Schlüssel aus einer vertrauenswürdigen Quelle stammt. Ein kompromittierter öffentlicher Schlüssel untergräbt die gesamte Verifikation.
  • Die Funktion prüft nur die Integrität und Authentizität der Nachricht – keine Verschlüsselung. Für vertrauliche Kommunikation muss zusätzlich sodium_crypto_box() oder sodium_crypto_secretbox() eingesetzt werden.
  • Signatur und öffentlicher Schlüssel haben feste Längen: Signatur = SODIUM_CRYPTO_SIGN_BYTES (64 Byte), öffentlicher Schlüssel = SODIUM_CRYPTO_SIGN_PUBLICKEYBYTES (32 Byte). Eine Längenprüfung vor dem Aufruf ist empfehlenswert.
  • Die Funktion wirft eine SodiumException, wenn die Signaturgröße ungültig ist.
  • Niemals selbst implementierte Vergleiche (z. B. mit === oder strcmp()) für Signaturen verwenden – libsodium verwendet intern timing-sichere Vergleiche.