Signatur
Beschreibung
password_verify() ist das Gegenstück zu password_hash(). Es liest Algorithmus, Cost und Salt aus dem gespeicherten Hash, wendet den gleichen Algorithmus auf das eingegebene Klartext-Passwort an und vergleicht das Ergebnis zeitkonstant.
Der zeitkonstante Vergleich ist wichtig: Ein naives if ($computed === $stored) würde bei ungleicher Länge sofort abbrechen und wäre so mit Timing-Angriffen angreifbar. password_verify() vergleicht immer alle Bytes und braucht deshalb unabhängig vom Input dieselbe Zeit.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $password Pflicht | string | — | Das vom User eingegebene Klartext-Passwort. |
| $hash Pflicht | string | — | Der aus der Datenbank geladene, mit password_hash() erzeugte Hash. |
Rückgabewert
true, wenn das Passwort zum Hash passt, sonst false.Beispiele
Login-Flow
<?php
$row = $db->prepare('SELECT id, password FROM users WHERE email = ?');
$row->execute([$request['email']]);
$user = $row->fetch();
if ($user && password_verify($request['password'], $user['password'])) {
// Erfolgreich — Session starten
session_regenerate_id(true);
$_SESSION['user_id'] = $user['id'];
} else {
// Immer generische Fehlermeldung — nie "User existiert nicht"
throw new AuthException('Ungültige Anmeldedaten');
}
// Wichtig · Fallstricke
Wichtig: Auch wenn der User nicht existiert, führe eine Dummy-Verifikation aus. Sonst verrätst du über die Antwortzeit, ob eine E-Mail-Adresse registriert ist (User-Enumeration).