Signatur
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
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;
}
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.';
// 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.