Signatur
Beschreibung
password_hash() ist die von PHP mitgelieferte, sichere Methode, ein Passwort so zu hashen, dass es in einer Datenbank gespeichert werden kann. Die Funktion generiert automatisch einen kryptografisch sicheren, zufälligen Salt und legt den verwendeten Algorithmus zusammen mit dem Hash im Rückgabewert ab.
Standardmäßig wird bcrypt (PASSWORD_BCRYPT) verwendet. Seit PHP 7.2 ist zusätzlich Argon2i und seit PHP 7.3 Argon2id verfügbar. Verwende PASSWORD_DEFAULT, damit PHP automatisch den jeweils empfohlenen Algorithmus wählt — beim nächsten PHP-Update aktualisiert sich das automatisch.
Der Rückgabewert enthält bereits Algorithmus, Cost-Faktor und Salt. Du brauchst also kein separates Feld für den Salt in der Datenbank — ein Spalte password_hash VARCHAR(255) reicht.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $password Pflicht | string | — | Das Klartext-Passwort. Ab PHP 8.0 darf es nicht länger als 4096 Zeichen sein, sonst wirft die Funktion eine Warnung. |
| $algo Pflicht | string|int|null | — | Der zu verwendende Algorithmus. Nutze PASSWORD_DEFAULT (empfohlen), PASSWORD_BCRYPT, PASSWORD_ARGON2I oder PASSWORD_ARGON2ID. |
| $options | array | [] | Algorithmus-spezifische Optionen. Für bcrypt: ['cost' => 12]. Für Argon2: memory_cost, time_cost, threads. |
Rückgabewert
Beispiele
Passwort beim Registrieren hashen
<?php
$plain = 'geheim123';
$hash = password_hash($plain, PASSWORD_DEFAULT);
// In DB speichern (VARCHAR(255) empfohlen)
$db->prepare('INSERT INTO users (email, password) VALUES (?, ?)')
->execute(['anna\@example.com', $hash]);
Höheren Cost-Faktor setzen
<?php
// Höherer Cost = sicherer, aber langsamer.
// Faustregel: mindestens 12, in 2026 eher 14.
$hash = password_hash('geheim', PASSWORD_BCRYPT, ['cost' => 14]);
// Wichtig · Fallstricke
- Nie das Passwort selbst in der Datenbank speichern — auch nicht verschlüsselt.
- Nie MD5, SHA1 oder eigene Hash-Konstruktionen verwenden —
password_hash()nutzt bereits alles Richtige (Salt, Key Stretching). - Cost-Faktor regelmäßig prüfen: mit
password_needs_rehash()beim nächsten Login neu berechnen, wenn Cost gestiegen ist.