Passwörter im Visier: Warum alte Methoden nicht mehr funktionieren
\nStellen Sie sich vor: Sie sind ein Entwickler, der ein Registrierungssystem schreibt. Was könnte einfacher sein? Passwort nehmen, durch md5 jagen, in der Datenbank speichern. Aber im Jahr 2025 ist dieser Ansatz — der direkte Weg zur Verwundbarkeit. Moderne Angriffe, GPU-Brute-Force und Regenbogentabellen verwandeln schwache Hashes in Sekunden zu Staub. Die Frage von Stack Overflow mit Tausenden von Aufrufen – „Secure hash and salt for PHP passwords“ – verliert nicht an Aktualität, und wir werden sie ein für alle Mal klären.
\nIn diesem Artikel erfahren Sie, wie Sie Passwörter in PHP korrekt hashen, indem Sie moderne Algorithmen, integrierte Funktionen und Salt verwenden. Wir passen die besten Antworten der Community für Bildungsinhalte an und zeigen, wie Sie Benutzer selbst im Jahr 2025 schützen können.
\n\nWarum md5 und sha1 böse sind
\nWenn Sie immer noch md5 oder sha1 zum Speichern von Passwörtern verwenden – hören Sie auf. Diese Algorithmen wurden für Geschwindigkeit entwickelt, nicht für Sicherheit. Im Jahr 2025 kann eine GPU Milliarden von md5-Hashes pro Sekunde erraten. Das Hinzufügen von Salt (einer zufälligen Zeichenfolge) hilft nicht: Regenbogentabellen werden umgangen, aber die Geschwindigkeit bleibt fatal.
\n- \n
- Md5: 2^128 Varianten – in Minuten geknackt. \n
- Sha1: etwas besser, aber ebenfalls veraltet. \n
- Salt ohne Verlangsamung: Wenn der Hash schnell ist, verzögert Salt den Angriff nur. \n
Stattdessen werden Algorithmen mit „Verlangsamung“ benötigt – solche, die Zeit und Speicher erfordern. Genau diese verwendet password_hash.
password_hash und password_verify: Integrierte Lösung von PHP
\nSeit PHP 5.5 gibt es zwei Funktionen, die 90% der Probleme mit der Passwortsicherheit lösen: password_hash und password_verify. Sie generieren automatisch ein kryptografisch sicheres Salt und verwenden Algorithmen, die gegen Brute-Force resistent sind. Im Jahr 2025 ist dies der Standard, und keine selbstgebauten Fahrräder mehr!
Wie funktioniert das?
\nDie Funktion password_hash nimmt ein Passwort und einen Algorithmus (standardmäßig bcrypt, aber argon2 kann angegeben werden). Sie gibt eine Zeichenfolge zurück, die bereits Salt und Parameter enthält. Sie müssen Salt nicht separat speichern – es befindet sich im Hash.
<?php\n// Passwort hashen\n$password = "SuperSecret123!";\n$hash = password_hash($password, PASSWORD_DEFAULT);\n\necho $hash; // $2y$10$... (60 Zeichen)\n?>\n\nJetzt überprüfen wir das Passwort beim Login:
\n<?php\n$inputPassword = "SuperSecret123!";\n$storedHash = "$2y$10$..."; // aus der Datenbank\n\nif (password_verify($inputPassword, $storedHash)) {\n echo "Passwort ist korrekt!";\n} else {\n echo "Falsches Passwort.";\n}\n?>\n\nAlles genial einfach. password_verify extrahiert automatisch das Salt aus dem Hash und überprüft das Passwort. Keine zusätzlichen Aktionen erforderlich.
Algorithmusauswahl: bcrypt vs argon2
\nIm Jahr 2025 haben Sie zwei Hauptoptionen:
\n- \n
- Bcrypt (PASSWORD_BCRYPT): bewährt, standardmäßig verwendet. Resistent gegen Angriffe, erfordert aber die Konfiguration des Cost-Faktors. \n
- Argon2 (PASSWORD_ARGON2I oder PASSWORD_ARGON2ID): Gewinner des Password Hashing Competition. Moderner, benötigt mehr Speicher, was GPU-Angriffe erschwert. Für neue Projekte empfohlen. \n
Beispiel mit argon2:
\n<?php\n$hash = password_hash($password, PASSWORD_ARGON2ID, [\n 'memory_cost' => 1 << 17, // 128 MB\n 'time_cost' => 4,\n 'threads' => 2\n]);\n?>\n\nDer Parameter memory_cost ist die Speichermenge in Kilobyte. Je höher, desto sicherer, aber langsamer. Testen Sie für die Produktion auf Ihrem Server.
Salt: Wie es funktioniert und warum es nicht separat benötigt wird
\nViele Anfänger fragen: „Wie füge ich manuell Salt hinzu?“. Die Antwort: gar nicht. password_hash generiert 22 Zeichen zufälliges Salt (für bcrypt