Start · Sprachen · PHP · Referenz · openssl_password_verify

openssl_password_verify

Funktion

Überprüft ein Klartext-Passwort gegen einen mit OpenSSLs Argon2-Implementierung erzeugten Hash und gibt <code>true</code> zurück, wenn das Passwort übereinstimmt.

seit PHP 8.4.0 Kategorie: crypto

Signatur

openssl_password_verify(string $password, string $hash): bool

Beschreibung

openssl_password_verify() prüft, ob ein übergebenes Klartext-Passwort mit dem angegebenen Hash übereinstimmt, der zuvor mit openssl_password_hash() erzeugt wurde. Die Funktion nutzt OpenSSLs Argon2-Implementierung und ist das Gegenstück zu openssl_password_hash(), analog zu dem Paar password_hash() / password_verify() der Standard-PHP-API.

Der Vergleich wird intern mit einem zeitkonstanten Algorithmus durchgeführt, um Timing-Angriffe zu verhindern. Der im Hash kodierte Salt sowie die Konfigurationsparameter (Speicherbedarf, Iterationen, Parallelität) werden automatisch aus dem Hash-String extrahiert und für die Verifikation verwendet – es ist kein gesondertes Übergeben dieser Parameter notwendig.

Diese Funktion ist besonders dann sinnvoll, wenn Argon2 über die OpenSSL-Bibliothek anstelle der libsodium- oder internen PHP-Implementierung genutzt werden soll, etwa in Umgebungen, in denen OpenSSL explizit bevorzugt wird oder libsodium nicht verfügbar ist.

Für neu erstellte Anwendungen ohne spezifische Anforderungen an die Kryptographie-Bibliothek ist die Verwendung von password_verify() mit einem geeigneten Algorithmus wie PASSWORD_ARGON2ID weiterhin die empfohlene Standardlösung.

Parameter

Name Typ Default Beschreibung
$password Pflicht string Das Klartext-Passwort, das überprüft werden soll.
$hash Pflicht string Der zuvor mit openssl_password_hash() erzeugte Hash-String im PHC-Format, der Salt und Konfigurationsparameter enthält.

Rückgabewert

Typ
bool
Beschreibung
Gibt true zurück, wenn das Passwort dem Hash entspricht, andernfalls false. Im Fehlerfall (z. B. ungültiger Hash-String) wird ebenfalls false zurückgegeben.

Beispiele

Einfache Passwort-Verifikation mit OpenSSL Argon2

<?php
$password = 'geheimesPasswort123';

// Hash beim Registrieren des Benutzers erzeugen
$hash = openssl_password_hash($password, PASSWORD_ARGON2ID);
echo 'Erzeugter Hash: ' . $hash . PHP_EOL;

// Hash beim Login überprüfen
if (openssl_password_verify($password, $hash)) {
    echo 'Passwort korrekt – Zugriff gewährt.' . PHP_EOL;
} else {
    echo 'Passwort falsch – Zugriff verweigert.' . PHP_EOL;
}

// Test mit falschem Passwort
if (openssl_password_verify('falschesPasswort', $hash)) {
    echo 'Passwort korrekt.' . PHP_EOL;
} else {
    echo 'Passwort falsch – Zugriff verweigert.' . PHP_EOL;
}
Erzeugter Hash: $argon2id$v=19$m=65536,t=4,p=1$... Passwort korrekt – Zugriff gewährt. Passwort falsch – Zugriff verweigert.

Praxisnahe Login-Prüfung mit Datenbank-Hash

<?php
// Simulierter Datenbankaufruf – Hash wurde zuvor mit openssl_password_hash() gespeichert
function getUserHashFromDatabase(string $username): string|false {
    // Beispiel-Datenbank-Ergebnis
    $users = [
        'alice' => '$argon2id$v=19$m=65536,t=4,p=1$c2FsdHdlcnQ$hashedvalue',
    ];
    return $users[$username] ?? false;
}

function loginUser(string $username, string $password): bool {
    $hash = getUserHashFromDatabase($username);
    if ($hash === false) {
        // Benutzer nicht gefunden – trotzdem Zeit verbrauchen, um Enumeration zu erschweren
        openssl_password_verify($password, '$argon2id$v=19$m=65536,t=4,p=1$dummy$dummy');
        return false;
    }
    return openssl_password_verify($password, $hash);
}

$result = loginUser('alice', 'meinPasswort');
echo $result ? 'Login erfolgreich.' : 'Login fehlgeschlagen.';
Login fehlgeschlagen.

// Wichtig · Fallstricke

Sicherheit: Der Vergleich ist zeitkonstant, um Timing-Angriffe zu verhindern. Dennoch sollte bei nicht gefundenem Benutzer ebenfalls eine Hash-Verifikation mit einem Dummy-Hash durchgeführt werden, um die Antwortzeit zu normalisieren und Benutzerenumeration zu erschweren (siehe zweites Beispiel).

Verfügbarkeit: Die Funktion ist nur verfügbar, wenn PHP mit OpenSSL-Unterstützung kompiliert wurde (--with-openssl) und die OpenSSL-Version Argon2 unterstützt. Dies kann mit openssl_get_md_methods() oder durch Prüfen von function_exists('openssl_password_hash') verifiziert werden.

Kompatibilität: Hashes, die mit openssl_password_hash() erzeugt wurden, können aufgrund des identischen PHC-Formats auch mit password_verify() und umgekehrt verifiziert werden, sofern der gleiche Algorithmus (z. B. Argon2id) verwendet wurde und die PHP-Implementierung diesen unterstützt.

Neu in PHP 8.4: Diese Funktion wurde in PHP 8.4.0 eingeführt und ist in älteren PHP-Versionen nicht verfügbar.