Start · Sprachen · PHP · Referenz · openssl_verify

openssl_verify

Funktion

Überprüft die digitale Signatur von Daten mithilfe eines öffentlichen Schlüssels und gibt zurück, ob die Signatur gültig ist.

seit PHP 4.0.4 Kategorie: crypto

Signatur

openssl_verify(string $data, string $signature, OpenSSLAsymmetricKey|OpenSSLCertificate|array|string $public_key, string|int $algorithm = OPENSSL_ALGO_SHA1): int|false

Beschreibung

openssl_verify() prüft, ob eine digitale Signatur zu den angegebenen Daten und dem öffentlichen Schlüssel passt. Dies ist der Gegenpol zu openssl_sign(): Während letztere eine Signatur mit dem privaten Schlüssel erzeugt, verifiziert openssl_verify() diese Signatur mit dem zugehörigen öffentlichen Schlüssel.

Typische Anwendungsfälle sind die Überprüfung der Integrität und Authentizität von Nachrichten, API-Tokens, Software-Updates oder signierten Dokumenten. Die Funktion stellt sicher, dass die Daten nicht verändert wurden und tatsächlich vom Inhaber des privaten Schlüssels stammen.

Der Parameter algorithm sollte dem Algorithmus entsprechen, der bei der Erzeugung der Signatur verwendet wurde. Ab PHP 5.2 können auch Algorithmus-Namen als Zeichenketten (z. B. 'sha256WithRSAEncryption') übergeben werden. Moderne Anwendungen sollten mindestens SHA-256 verwenden, da SHA-1 als kryptografisch unsicher gilt.

Der öffentliche Schlüssel kann als OpenSSLAsymmetricKey-Ressource (ab PHP 8.0), als OpenSSLCertificate-Objekt, als PEM-kodierter Schlüsselstring oder als Array im Format array($zertifikat, $passphrase) übergeben werden.

Parameter

Name Typ Default Beschreibung
$data Pflicht string Die Originaldaten, deren Signatur überprüft werden soll. Muss exakt identisch mit den Daten sein, die bei der Signaturerzeugung verwendet wurden.
$signature Pflicht string Die zu prüfende binäre Signatur, wie sie z. B. von openssl_sign() erzeugt wurde.
$public_key Pflicht OpenSSLAsymmetricKey|OpenSSLCertificate|array|string Der öffentliche Schlüssel zur Verifikation. Kann ein OpenSSLAsymmetricKey-Objekt, ein OpenSSLCertificate-Objekt, ein PEM-kodierter Schlüsselstring oder ein Array der Form [zertifikat, passphrase] sein.
$algorithm string|int OPENSSL_ALGO_SHA1 Der Signaturalgorithmus als Konstante (z. B. OPENSSL_ALGO_SHA256) oder als Zeichenkette (z. B. 'sha256WithRSAEncryption'). Muss dem bei der Signaturerzeugung verwendeten Algorithmus entsprechen.

Rückgabewert

Typ
int|false
Beschreibung
Gibt 1 zurück, wenn die Signatur korrekt ist, 0 wenn sie ungültig ist, und false bei einem Fehler (z. B. ungültiger Schlüssel). Achtung: Beim Prüfen des Rückgabewerts unbedingt den strikten Vergleich (===) verwenden, da 0 und false bei losem Vergleich gleich behandelt werden.

Beispiele

Signatur erzeugen und verifizieren

<?php
// Schlüsselpaar erzeugen
$keyPair = openssl_pkey_new([
    'digest_alg'       => 'sha256',
    'private_key_bits' => 2048,
    'private_key_type' => OPENSSL_KEYTYPE_RSA,
]);

// Privaten Schlüssel exportieren
openssl_pkey_export($keyPair, $privateKey);

// Öffentlichen Schlüssel auslesen
$keyDetails = openssl_pkey_get_details($keyPair);
$publicKey  = $keyDetails['key'];

$data = 'Dies ist eine wichtige Nachricht.';

// Signatur erzeugen
openssl_sign($data, $signature, $privateKey, OPENSSL_ALGO_SHA256);

// Signatur überprüfen
$result = openssl_verify($data, $signature, $publicKey, OPENSSL_ALGO_SHA256);

if ($result === 1) {
    echo 'Signatur ist gültig.';
} elseif ($result === 0) {
    echo 'Signatur ist UNGÜLTIG!';
} else {
    echo 'Fehler bei der Überprüfung: ' . openssl_error_string();
}
Signatur ist gültig.

Manipulation der Daten erkennen

<?php
// Schlüsselpaar aus PEM-Dateien laden
$privateKey = openssl_pkey_get_private(file_get_contents('private.pem'));
$publicKey  = openssl_pkey_get_public(file_get_contents('public.pem'));

$originalData = 'Betrag: 100 EUR';

// Signatur mit SHA-256 erzeugen
openssl_sign($originalData, $signature, $privateKey, OPENSSL_ALGO_SHA256);

// Angreifer verändert die Daten
$manipulatedData = 'Betrag: 999 EUR';

// Verifizierung schlägt fehl
$result = openssl_verify($manipulatedData, $signature, $publicKey, OPENSSL_ALGO_SHA256);

if ($result === 1) {
    echo 'Signatur gültig – Daten unverändert.';
} elseif ($result === 0) {
    echo 'Signatur ungültig – Daten wurden manipuliert!';
} else {
    echo 'Fehler: ' . openssl_error_string();
}
Signatur ungültig – Daten wurden manipuliert!

// Wichtig · Fallstricke

Sicherheitshinweis SHA-1: Der Standard-Algorithmus OPENSSL_ALGO_SHA1 gilt als kryptografisch unsicher. Verwende in neuen Anwendungen mindestens OPENSSL_ALGO_SHA256.

Rückgabewert-Fallstrick: Die Funktion gibt 0 (ungültig), 1 (gültig) oder false (Fehler) zurück. Ein loser Vergleich (==) behandelt 0 und false identisch. Immer mit === 1 auf Gültigkeit prüfen.

Ressourcenverwaltung: Ab PHP 8.0 werden Schlüssel als Objekte (OpenSSLAsymmetricKey) statt als Ressourcen verwaltet. In PHP 7.x sollten Schlüssel-Ressourcen nach der Verwendung mit openssl_free_key() freigegeben werden (ab PHP 8.0 nicht mehr nötig).

Fehlerbehandlung: Im Fehlerfall (false) liefert openssl_error_string() weitere Informationen aus dem OpenSSL-Fehlerstack.