Was ist md5?
In PHP gibts die Funktion md5() , diese kann man vielseitig einsetzen, aber zuersteinmal müssen wir wissen das md5 überhaupt ist.
Inhaltsverzeichnis
Was ist md5?
Bei md5 handelt es sich um einen Hash-Algorithmus. Mit Hash-Algorithmen kann man von beliebig langen Text/Dateien einen Hash-Wert ermitteln, eine Art Fingerabdruck. Dieser Fingerabdruck ist immer gleich lang (bei md5 128 Bit), und die selbe Datei/Text ergibt den gleichen Fingerabdruck. Sobald sich im Text nur ein Zeichen ändert (auf Groß- und Kleinschreibung wird geachtet), sieht der Fingerabdruck komplett anders aus.
Das Besondere an dem Fingerabdruck/Hash-Wert ist, so ist es zumindest noch bei md5, dass man einen Hash-Wert nicht wieder in den Text umwandeln kann. Sprich, man kann so einen Hash-Wert nicht wieder 'entschlüsseln'.
Dies hat mehrere Gründe, einer ist, das ein Hashwert nicht eindeutig ist, also zwei komplett verschiedene Texte können den gleichen Hash-Wert haben. Die Wahrscheinlichkeit dafür ist aber sehr gering, denn es gibt rund 3,4 * 10 38 (eine Zahl mit 39 Stellen) verschiedene Hash-Werte.
Das fünf mal nacheinander beim Lotto die gleichen Zahlen gezogen werden ist wahrscheinlicher.
Wie kann ich md5 jetzt nutzen?
Hmm ich erhalte jetzt von einem Text einen Hash-Wert, aber diesen Hash-Wert kann ich nicht wieder entschlüsseln, was soll ich damit?
Wie wir wissen, ergibt ein Text immer den gleichen Hash-Wert. Dies kann man gut bei Passwörter benutzen, denn diese soll man ja nicht unverschlüsselt speichern.
Wenn sich jetzt ein Besucher mit Passwort registiert, ermitteln wir per md5 den Hashwert des Passwort und speichern dann nur den Hashwert.
Wenn sich der User später einloggen möchte, gibt er sein Passwort dann, daraus ermitteln wir wieder den Hashwert, und wenn der Hashwert vom Login der gleiche ist wie der gespeicherte Wert, dann hat der User das richtige Passwort eingegeben, sonst nicht.
Ist md5 unknackbar?
Nein, man kann aus einem Hashwert wieder Informationen gewinnen.
Per Brute Force verwandelt man jedes theoretisch mögliche Passwort in den md5-Hashwert, wenn dann der gespeicherte Hashwert gleich ist wie das gerade getestete, gibt das Programm den gerade getesteten Text aus, denn diesen hat es sich vorher gemerkt (gespeichert in einer Variable).
Deswegen ist es wichtig, lange Passwörter zu benutzen, die nicht aus einem Wörterbuch stammen.
In Zukunft wird es evt. möglich sein, md5-Hashwerte ganz leicht zu knacken, bzw. man kann dann einen anderen Text mit dem gleichen Hashwert errechnen. So weit ich weiß, gibt es dafür aber noch eine öffentliche Lösung/Theorie, die anwendbar wäre.
Denn Brute Force kann bei langen Passwörter (10 oder mehr Zeichen) mehrere hundert Jahre dauern.
Wie funktioniert das ganze in PHP?
Dank PHP können wir diese Funktion ganz einfach benutzen, denn der Algorithmus ist schon in PHP vorhanden.
Der PHP Code sieht dafür so aus:
1 2 3 4 5 |
<?php $text = "PHP-Einfach"; $md5 = md5($text); echo $md5; ?> |
Wann ist mein Passwort "sicher"?
Das ist eine schwierige Frage, auf alle Fälle sollte man nie ein Passwort benutzen, welches man im Wörterbuch findet.
Desweiteren sollte man möglichst viele Verschieden Zeichen benutzen, also Klein- und Großbuchstaben, Zahlen und Sonderzeichen.
Denn md5 macht einen Unterschied zwischen A und a.
Dann sollte das Passwort nicht zu kurz sein. Ein Alpha-Numerisches (Buchstaben und Zahlen) Passwort welches 8 Zeichen hat kann man im durchscnitt in 2 Tagen knacken.
Also sollten es schon min. 10 Zeichen benutzen, denn dann dauert das schon um die 5 Jahre. Wenn man Sonderzeichen und Großbuchstaben im Passwort sind wird diese Sicherheit nochmals erhöht.
Ein andere Trick sind sogenannte Passpharsen. Dies sind kleine Sätze die man als Passwort nimmt. Diese Passpharsen sollte keinen Sinn ergeben.
Z.B. so einen Satz: Das kleine Auto hammert den schönen Stuhl.
Hier ist es auch wieder wichtig, dass man mehrere Wörter benutzt. Denn sonst nimmt er für den Brute Force Angriff nicht das Alphabet, sondern ein Wörterbuch und kombiniert die Wörter dann damit. Aber für unser Passwort bräuchte man dann ca. 10 Billiarden Jahre.
Dem Angreifer das leben Schwer machen
Natürlich kann sich ein Admin noch ein paar gemeinheiten Ausdenken, damit ein Angreifer es schwer hat, das Passwort zu knacken.
Tipp 1: Passwörter geheim halten
Fremde Personen sollten nie die verschlüsselten Passwörter einsehen können, falls man die Passwörter in einer Textdatei speichern muss, sollte man die Datei möglichst gut verstecken und keine Namen wie passwort.txt geben.
Außerdem wäre es schlauer, die Passwörter in einer PHP-Datei zu speichern, ca. so:
1 2 3 |
<?php username|d7afde3e7059cd0a0fe09eec4b0008cd username2|0cc175b9c0f1b6a831c399e269772661 |
Wenn ihr diese Datei Zeilenweise einliest, dann entfernt einfach am Anfang <?php und schon habt Ihr die Logindaten.
Wenn ein Angreifer diese Datei jetzt aufruft, erhält er nur eine Fehlermeldung und nicht die Wertvollen Logindaten.
Wenn der Angreifer die Passwörterdatei nicht hat, müsste er über das Loginformular versuchen, das Passwort zu knacken, was um einiges schwerer ist, denn dann kann man nur noch ca. 30 - 80 Passwörter pro Sekunde testen, je nach Internetanbindung.
Am besten die Passwörter werden in einer Datenbank gespeichert oder die Passwortdatei ist in einem Passwortgeschützen Ordner bzw. in einem Ordner, den nur der Server öffnen/lesen kann.
Tipp 2: Sicherheit des Hash-Algorithmus erhöhen
Wie bereits erwähnt, verwenden leider viele Personen einen schlechtes Passwort und dieses dann auch noch für mehrere Dienste.
Wenn ein Angreifer also an den Hashwert gelangt und ihn knackt, kann er damit sehr viel Schaden anrichten.
Eine Möglichkeit dies zu unterbinden ist indem man seine Hashfunktion 'verbessert'. Seht dazu mehr unter Passwörter sicher speichern.
Tipp 3: Nach 10 Logins für 10 Min gesperrt
Hier wird einfach überprüft, wie oft sich jemand versucht einzuloggen. Falls jemand versucht sich 10 mal einzuloggen (ohne Erfolg), wird sein Benutzername für die nächsten 10 Minuten gesperrt.
Dies verspricht einen sehr hochen Schutz, allerdings können andere Personen Benutzer ärgern indem sie seinen Benutzernamen die ganze Zeit lang sperren.
Man kann auch den gesamten Bernutzernamen sperren lassen und ihm eine Mail mit Aktivierungslink schicken, damit sein Benutzername wieder aktiviert wird.
Eine andere Möglichkeit wäre auch die IP für eine bestimmte Zeit zu sperren, allerdings gibt es Proxy's über die man seine IP verändern kann. Wenn der Angreifer dann 10 falsche Login Versuche hat, wird einfach die nächste IP genommen.
Tipp 4: Bestätigungscode
Damit ist gemeint, dass ihr per PHP ein kleines Bild generiert, mit einem bestimmten Inhalt. Diesen Inhalt muss der User dann beim Login in ein weiteres Textfeld eingeben, um sich einzuloggen.
Das macht das leben für einen Angreifer (Cracker) extrem viel schwieriger, denn Maschinen haben oft Probleme den Inhalt des Bildes richtig zu lesen, allerdings nur wenn ihr den Text etwas verzehrt. Sprich einfach ein paar dünne Balken vor die Buchstaben machen, unterschiedliche Textgrößen nehmen etc.
Der Mensch kann es dann noch lesen, aber für einen PC zu gut wie unmöglich.