Start · Sprachen · PHP · Referenz · password_hash

password_hash

Funktion

Erzeugt einen sicheren, gesalzenen Hash aus einem Passwort — der einzige richtige Weg, Passwörter in PHP zu speichern.

seit PHP 5.5.0 Kategorie: crypto

Signatur

password_hash(string $password, string|int|null $algo, array $options = []): string

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

Typ
string
Beschreibung
Der gehashte String (60 Zeichen für bcrypt, ~96 für Argon2), inkl. Algorithmus-Info und Salt.

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]);
$2y$12$abcdefghijklmnopqrstuv... (60 Zeichen)

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.