Automatisch Starke Passwörter mit PHP erzeugen
In fast allen (Web-)Projekten, die ein Login-System verwenden, müssen vollautomatisch Passwörter erstellt werden. Diese werden den Nutzern dann beispielsweise per Email mitgeteilt. Doch leider sieht man immer wieder, wie dabei unsichere Passwörter entstehen. Dieser Artikel soll helfen mithilfe von PHP automatisch starke Passwörter zu erzeugen.
Wann ist ein Passwort sicher?
Ein Passwort ist umso sicherer je:
- länger es ist
- mehr verschiedene Zeichen es enthält
- weniger Sinn das Passwort in der Realität hat
Für Angreifer gibt es prinzipiell zwei Angriffsmöglichkeiten:
- automatisch sinnvolle Passwörter probieren z.B. mithilfe eines Wörterbuchs
- automatisch alle möglichen Passwörter durchprobieren (Bruteforce)
Theoretisch kann man mit PHP einfach ein 10.000 Zeichen langes Zeichenkette erstellen. Diese ist natürlich ein ziemlich sicheres Passwort, weil beide oberen Angriffe nutzlos wären. Doch leider mögen Menschen das Eintippen von 10.000 Zeichen als Passwort nicht besonders. Die Passwortlänge ist also immer ein Kompromiss zwischen Sicherheit und Nutzerfreundlichkeit.
Schlechte Passwortfunktion
function passwort_erstellen() { return substr(md5(microtime(true)),1,10); } echo passwort_erstellen();
Das Gute zu erst: Diese Funktion erstellt automatisch ein Passwort. Die Nachteile der Funktion liegen aber auf der Hand: Zum einen ist das Passwort immer genau 10 Zeichen lang (ich habe das so festgelegt, weil ich glaube, dass das Eintippen noch längerer Passwörter für Nurzer zu aufwendig wäre.). Für Angreifer reduziert sich so die Anzahl der zu probierenden Passwörter, wodurch die Wahrscheinlichkeit zufällig das Richtige zu erwischen wächst. Der zweite Nachteil liegt im MD5, weil dieser ausschließlich die Zeichen a-f (nur Kleinbuchstaben) plus die 10 Ziffern (0 bis 9) verwendet. Dadurch sind nur 6+10=16 verschiedene Zeichen möglich. Es gibt also theorisch 16 hoch 10 mögliche Passwörter.
Stärkere Passwörter in PHP erzeugen
Ich verwende in meinen Projekten den folgenden Code:
//Darf frei verwendet werden! Ich würde mich über einen Link freuen :) function passwort_besser() { $buchst=array_merge(range('a','z'),range('A','Z')); $zahlen=range(0,9); $sonderzeichen=array('@','?','!','
Die Funktion passwort_besser erstellt ein Array „Zeichenpool“, dass alle im Passwort erlaubten Zeichen enthält. Als nächstes wird die Länge des Passworts bestimmt. Diese beträgt zwischen 8 und 12 Zeichen. Anschließend wird das Passwort solange um ein zufälliges Zeichen des Zeichenpools erweitert, bis die gewünschte Länge erreicht ist. Ich verwende absichtlich keine nachfolgende Prüfung, ob im Passwort mindestens eine Ziffer/ mind. ein Sonderzeichen enthalten ist, weil ich sonst dem Angreifer weitere Hinweise auf die Passwortzusammensetzung geben würde.
Verwendete PHP-Funktionen:
- ARRAY-Funktion: array_merge
- ARRAY-Funktion: range
- ARRAY-Funktion: array_flip
- ARRAY-Funktion: array_rand
- rand
Zwischenzusammenfassung
Der beschriebene Algorithmus bietet meiner Meinung nach den besten Kompromiss aus Sicherheit, Performance zur Erzeugung und Usability (Nutzerfreundlichkeit bei der Eingabe). Seine Schwachstelle liegt darin, dass ein automatisches Script Passwörter durchprobieren könnte. Um das zu unterbinden/zu erschweren gehe ich im Folgenden auf einige Möglichkeiten ein, die allerdings nichts mehr mit der eigentlichen Entwicklung von starken Passwörtern zu tun hat.
Capcha
Capchas sind kleine Bilder die (so hofft man) von Computern nicht gelesen werden können. Meist muss der Nutzer ein Wort abschreiben oder eine einfache Rechenaufgabe lösen. Diese Variante hat sich als sehr effektiv herausgestellt, weil aktuell die Bilderkennung noch nicht soweit ist, dass die Bilder (wenn die Schrift etwas komplizierter ist) in annehmbarer Qualität ausgelesen werden können. Da sich das in der Zukunft ändern könnte, besteht eine weitere Möglichkeit der Absicherung im Begrenzen der Fehleingaben.
Anzahl der Fehleingaben begrenzen
Jeder (auch wenn es keiner zugibt) kennt es vom Geldabheben bei der Bank. Dreimal falsche PIN eingegeben und schon wird die Karte einkassiert. Genauso könnte man Webseiten sichern. Hat ein Nutzer das Passwort X mal falsch eingegeben so wird seine IP für Y Stunden/Tage/Wochen gesperrt. Alle zukünftigen Anfragen von gespeicherten IPs werden automatisch ohne Prüfung ob das Passwort stimmt abgelehnt.
Hinweis:Eventuell sollte zusätzlich zur IP noch weitere Informationen des Nutzers gespeichert werden, weil u.u. mehrere Nutzer die selbe IP verwenden, und deshalb auch Unbeteiligte gesperrt werden könnten.
); //ggf. Erweitern $zeichen_pool=array_merge($buchst,$zahlen,$sonderzeichen); $zeichen_pool=array_flip($zeichen_pool); //Damit array-Rand den Array-Wert und nicht den Array-Index bekommt $länge=rand(8,12); $pass=''; for ($x=1;$x<$länge;$x++) { $pass.=array_rand($zeichen_pool); } return $pass; } echo passwort_besser();
Die Funktion passwort_besser erstellt ein Array „Zeichenpool“, dass alle im Passwort erlaubten Zeichen enthält. Als nächstes wird die Länge des Passworts bestimmt. Diese beträgt zwischen 8 und 12 Zeichen. Anschließend wird das Passwort solange um ein zufälliges Zeichen des Zeichenpools erweitert, bis die gewünschte Länge erreicht ist. Ich verwende absichtlich keine nachfolgende Prüfung, ob im Passwort mindestens eine Ziffer/ mind. ein Sonderzeichen enthalten ist, weil ich sonst dem Angreifer weitere Hinweise auf die Passwortzusammensetzung geben würde.
Verwendete PHP-Funktionen:
- ARRAY-Funktion: array_merge
- ARRAY-Funktion: range
- ARRAY-Funktion: array_flip
- ARRAY-Funktion: array_rand
- rand
Zwischenzusammenfassung
Der beschriebene Algorithmus bietet meiner Meinung nach den besten Kompromiss aus Sicherheit, Performance zur Erzeugung und Usability (Nutzerfreundlichkeit bei der Eingabe). Seine Schwachstelle liegt darin, dass ein automatisches Script Passwörter durchprobieren könnte. Um das zu unterbinden/zu erschweren gehe ich im Folgenden auf einige Möglichkeiten ein, die allerdings nichts mehr mit der eigentlichen Entwicklung von starken Passwörtern zu tun hat.
Capcha
Capchas sind kleine Bilder die (so hofft man) von Computern nicht gelesen werden können. Meist muss der Nutzer ein Wort abschreiben oder eine einfache Rechenaufgabe lösen. Diese Variante hat sich als sehr effektiv herausgestellt, weil aktuell die Bilderkennung noch nicht soweit ist, dass die Bilder (wenn die Schrift etwas komplizierter ist) in annehmbarer Qualität ausgelesen werden können. Da sich das in der Zukunft ändern könnte, besteht eine weitere Möglichkeit der Absicherung im Begrenzen der Fehleingaben.
Anzahl der Fehleingaben begrenzen
Jeder (auch wenn es keiner zugibt) kennt es vom Geldabheben bei der Bank. Dreimal falsche PIN eingegeben und schon wird die Karte einkassiert. Genauso könnte man Webseiten sichern. Hat ein Nutzer das Passwort X mal falsch eingegeben so wird seine IP für Y Stunden/Tage/Wochen gesperrt. Alle zukünftigen Anfragen von gespeicherten IPs werden automatisch ohne Prüfung ob das Passwort stimmt abgelehnt.
Hinweis:Eventuell sollte zusätzlich zur IP noch weitere Informationen des Nutzers gespeichert werden, weil u.u. mehrere Nutzer die selbe IP verwenden, und deshalb auch Unbeteiligte gesperrt werden könnten.
Schreibe einen Kommentar