Bcrypt in PHP: Wie man Passwörter schnell und fehlerfrei hasht

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: Wie man Passwörter schnell und fehlerfrei hasht

\n\n

Haben Sie sich jemals gefragt, warum Ihre PHP-Website bei der Benutzerregistrierung lahmt? Oder, noch schlimmer, warum es Hackern dennoch gelingt, Passwörter aus Ihrer Datenbank zu stehlen? Die Antwort könnte darin liegen, wie Sie bcrypt zum Hashing von Passwörtern in PHP verwenden.

\n\n

Diese Frage ist eine der beliebtesten auf Stack Overflow (tausende Aufrufe!). Und das ist kein Wunder: Passwortsicherheit ist ein Thema, bei dem ein einziger Fehler Sie Ihren Ruf kosten kann und den Benutzern ihre Daten. Aber heute werden wir nicht nur besprechen, wie man password_hash mit bcrypt verwendet. Wir werden über Optimierung und Leistung sprechen. Denn, seien wir ehrlich, 5 Sekunden beim Login zu warten, ist nicht cool.

\n\n

Lassen Sie uns herausfinden, wie man das Hashing von Passwörtern in PHP nicht nur sicher, sondern auch schnell macht. Los geht's!

\n\n

Warum bcrypt? Und warum nicht MD5 oder SHA?

\n\n

Viele Anfänger (und leider auch einige "Erfahrene") verwenden immer noch md5() oder sha1(). Das ist, als würde man die Tür mit einem Plastikriegel verschließen – es sieht verschlossen aus, aber ein Hauch genügt, und sie geht auf. MD5 und SHA sind schnelle Hashes. Viel zu schnell. Ein Hacker mit einer modernen GPU kann Milliarden solcher Hashes pro Sekunde durchprobieren.

\n\n

Bcrypt verfolgt einen grundlegend anderen Ansatz. Es wurde absichtlich langsam konzipiert. Es verwendet ein "Salt" (zufällige Daten) und einen "Cost Factor" (Kostenfaktor), der den Algorithmus zwingt, länger zu laufen. Während ein Hacker einen einzigen bcrypt-Hash berechnet, könnte er eine Million MD5-Hashes durchprobieren. Deshalb ist bcrypt der De-facto-Standard für PHP.

\n\n

Grundlagen: Wie man bcrypt in PHP richtig verwendet

\n\n

Seit PHP 5.5 haben wir die magische Funktion password_hash(). Vergessen Sie das manuelle Hinzufügen von Salt und den Aufruf von crypt() – alles ist bereits für Sie erledigt.

\n\n

So sieht das korrekte Hashing eines Passworts mit bcrypt aus:

\n\n
<?php\n// Passwort hashen\n$password = 'MySuperSecretPassword123!';\n$hash = password_hash($password, PASSWORD_BCRYPT);\n\necho $hash;\n// Ausgabe: $2y$10$... (60 Zeichen langer String)\n?>
\n\n

Fertig! password_hash generiert selbstständig ein zufälliges Salt und wählt einen optimalen Cost Factor (standardmäßig 10). Und wie überprüft man das Passwort beim Login?

\n\n
<?php\n// Passwort überprüfen\n$inputPassword = 'MySuperSecretPassword123!';\n$hashFromDB = '$2y$10$...'; // der gleiche Hash aus der Datenbank\n\nif (password_verify($inputPassword, $hashFromDB)) {\n    echo "Passwort korrekt! Willkommen.";\n} else {\n    echo "Falsches Passwort. Bitte versuchen Sie es erneut.";\n}\n?>
\n\n

Einfach, oder? Aber der Teufel steckt, wie immer, im Detail. Lassen Sie uns über das Wichtigste sprechen – die Leistung.

\n\n

Optimierung von bcrypt: Wie man die Balance zwischen Sicherheit und Geschwindigkeit findet

\n\n

Der Hauptparameter, der die Leistung von bcrypt in PHP beeinflusst, ist der Cost Factor (Kostenfaktor). Er wird als zweites Argument in password_hash() als Array ['cost' => 12] angegeben.

\n\n

Was ist Cost? Es ist eine logarithmische Skala. Jede Einheit erhöht die Ausführungszeit ungefähr um den Faktor 2.

\n\n
    \n
  • Cost = 10 (Standard): ~0,1-0,2 Sekunden. Schnell, aber für 2024 bereits zu wenig.
  • \n
  • Cost = 12: ~0,4-0,8 Sekunden. Gute Balance für die meisten Projekte.
  • \n
  • Cost = 14: ~1,5-3 Sekunden. Sehr sicher, aber Benutzer werden nervös.
  • \n
  • Cost = 16+: >5 Sekunden. Nur, wenn Sie ein Spion sind oder Atomcodes aufbewahren.
  • \n
\n\n

Wie wählt man den idealen Cost? Es gibt eine einfache Regel: Auf Ihrem Server sollte das Hashing eines einzelnen Passworts nicht länger als 250-500 Millisekunden dauern. Das ist für den Benutzer nicht spürbar, macht aber einen Brute-Force-Angriff für den Hacker zu teuer.

\n\n

Leistung testen

Blogs

Buchempfehlungen