Bcrypt in PHP: Passwörter richtig und schnell hashen
\n\nWenn 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\nWarum 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\nWas ist bcrypt und warum ist es besser als MD5 oder SHA1?
\n\nLass 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\nIn 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.
Wie man bcrypt in PHP verwendet: Ein einfaches Beispiel
\n\nFangen 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\nUnd 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\nGanz einfach, oder? Aber der Teufel steckt im Detail. Schauen wir uns den Cost Factor genauer an.
\n\nCost Factor einstellen: Balance zwischen Sicherheit und Geschwindigkeit
\n\nStandardmäß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.
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.
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\nAuf 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\nPerformance-Optimierung von bcrypt in PHP
\n\nKommen wir zum spannendsten Teil – wie machst du bcrypt schneller, ohne die Sicherheit zu opfern? Hier sind einige bewährte Strategien:
\n\n1. Ergebnisse cachen
\nWenn 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