Start · Sprachen · PHP · Referenz · password_verify

password_verify

Funktion

Prüft, ob ein Klartext-Passwort zu einem gespeicherten Hash passt — zeitkonstant und sicher gegen Timing-Angriffe.

seit PHP 5.5.0 Kategorie: crypto

Signatur

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

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

Typ
bool
Beschreibung
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).

Siehe auch