Bcrypt in PHP: Passwort-Hashing schnell & fehlerfrei

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Bcrypt in PHP: Passwörter richtig und schnell hashen

\n\n

Wenn du dich jemals gefragt hast "How do you use bcrypt for hashing passwords in PHP?", bist du nicht allein. Diese Frage auf Stack Overflow hat tausende Aufrufe – und das aus gutem Grund. Passwort-Hashing ist die Grundlage der Sicherheit jeder Webanwendung, und bcrypt bleibt einer der zuverlässigsten und beliebtesten Algorithmen. In diesem Artikel zeigen wir dir, wie du bcrypt in PHP einsetzt, es für maximale Leistung optimierst und typische Fallstricke vermeidest.

\n\n

Warum gerade bcrypt? Weil es durch integrierte "Salts" und einstellbare Komplexität resistent gegen Brute-Force-Angriffe ist. Aber wie stellst du sicher, dass deine Website bei jedem Login nicht ausbremst? Darum kümmern wir uns jetzt.

\n\n

Was ist bcrypt und warum ist es besser als MD5 oder SHA1?

\n\n

Lass uns gleich klarstellen: Verwende niemals MD5 oder SHA1 zum Hashen von Passwörtern. Diese Algorithmen wurden für schnelle Berechnungen entwickelt, nicht für Sicherheit. Bcrypt hingegen ist bewusst langsam konzipiert. Es nutzt einen Cost Factor, der bestimmt, wie viele Hash-Iterationen durchgeführt werden. Je höher der Cost Factor, desto länger dauert die Hash-Berechnung – und desto schwieriger wird es für Angreifer, ein Passwort zu knacken.

\n\n

In PHP wird die Arbeit mit bcrypt durch die Funktionen password_hash() und password_verify() maximal vereinfacht. Sie wurden mit PHP 5.5 eingeführt und sind seitdem der De-facto-Standard.

\n\n

Wie man bcrypt in PHP verwendet: Ein einfaches Beispiel

\n\n

Fangen wir einfach an. So registrierst du einen Benutzer und speicherst sein Passwort:

\n\n
<?php\n// Benutzerregistrierung\n$password = "MySuperP@ss123";\n$hash = password_hash($password, PASSWORD_BCRYPT);\n\n// Speichere $hash in der Datenbank (z.B. im Feld password_hash)\necho $hash; // Gibt etwas wie $2y$10$... aus\n?>
\n\n

Und so überprüfst du das Passwort beim Login:

\n\n
<?php\n// Benutzer-Login\n$loginPassword = "MySuperP@ss123";\n$storedHash = "$2y$10$..."; // aus der Datenbank\n\nif (password_verify($loginPassword, $storedHash)) {\n    echo "Passwort korrekt!";\n} else {\n    echo "Falsches Passwort.";\n}\n?>
\n\n

Ganz einfach, oder? Aber der Teufel steckt im Detail. Schauen wir uns den Cost Factor genauer an.

\n\n

Cost Factor einstellen: Balance zwischen Sicherheit und Geschwindigkeit

\n\n

Standardmäßig verwendet PASSWORD_BCRYPT einen Cost Factor von 10. Das bedeutet 2^10 = 1024 Iterationen. Auf einem modernen Server dauert das etwa 0,1–0,2 Sekunden. Klingt wenig, aber bei 1000 gleichzeitigen Logins summiert sich die Zeit schnell.

\n\n

Wie findest du den optimalen Cost Factor? Eine einfache Faustregel: Er sollte so eingestellt sein, dass das Hashen eines einzelnen Passworts auf deinem Server nicht länger als 0,5 Sekunden dauert. Du kannst dies mit der Funktion password_hash() und verschiedenen Werten testen.

\n\n

Hier ein Beispiel für einen Performancetest:

\n\n
<?php\n$password = "test_password";\n$times = [];\n\nfor ($cost = 8; $cost <= 14; $cost++) {\n    $start = microtime(true);\n    password_hash($password, PASSWORD_BCRYPT, ['cost' => $cost]);\n    $times[$cost] = microtime(true) - $start;\n}\n\nprint_r($times);\n?>
\n\n

Auf einem typischen Shared-Hosting ist ein Cost Factor von 10–12 optimal. Bei einem leistungsstarken Server kannst du auf 13–14 erhöhen. Übertreibe es aber nicht: Ein zu hoher Cost Factor kann dazu führen, dass dein Server bei einem Angriff alle Ressourcen fürs Hashen verbraucht.

\n\n

Performance-Optimierung von bcrypt in PHP

\n\n

Kommen wir zum spannendsten Teil – wie machst du bcrypt schneller, ohne die Sicherheit zu opfern? Hier sind einige bewährte Strategien:

\n\n

1. Ergebnisse cachen

\n

Wenn ein Benutzer das richtige Passwort eingibt, warum sollte es bei jeder Anfrage neu gehasht werden? Du kannst das Ergebnis kurzzeitig cachen (z.B. für 5 Minuten) mit Redis oder Memcached. Das ist besonders

Blogs

Buchempfehlungen