Passwortmythen oder „Was Du schon immer über Passwörter wusstest, aber nie zu sagen wagtest“
Gastartikel von Oliver Sperke.
Ich bin 34 Jahre alt und seit 10 Jahren selbständiger Webentwickler. Mein Fokus liegt dabei auf der Erstellung, Beratung und Optimierung in den Bereichen High Performance, Usability und Sicherheit in den gängisten Internetsprachen: PHP, HTML, Javascript und CSS.
Was Du vor dem Lesen wissen solltest
Die Sicherheit eines Passwortes ergibt sich aus dem verwendetem Zeichensatz und der Länge des Passwortes. Besteht ein Passwort nur aus den Ziffern 0 bis 9, hat der Zeichensatz eine Länge von 10. Besteht ein Passwort aus maximal 8 Ziffern, ergibt sich eine Anzahl möglicher Passwörter von 10^8+10^7+10^6+10^5+10^4+10^3+10^2+10^1 oder ~ 111,11 Mio. Möglichkeiten. In den meisten Erklärungen steht übrigens nur 10^8, allerdings gilt das nur, wenn ein Angreifer die Länge des Passwortes kennt. Ansonsten muss er nämlich alle Möglichkeiten ausprobieren, d. h. 0, 1, 2…01, 02, usw bis 99999999. Werden zusätzlich Kleinbuchstaben (also 0-9, a-z, äöüß) verwendet, ergibt sich ein „Schlüsselraum“, d. h. die mögliche Anzahl Passwörter von 40^8+40^7+…+40^1, also 6.72 Billionen Möglichkeiten usw.
Mythos: Ein Passwort mit mindestens 8 Zeichen ist sicher
Diesen Satz lese ich seit 10 Jahren mindestens dreimal im Jahr, nur vor 10 Jahren arbeiteten die schnellsten Heimcomputer in etwa auf dem Niveau eines heutigen Smartphones. Innerhalb dieser 10 Jahre hat sich die Computerwelt rasend schnell verändert. Auch durch das „pöse Internetz“, in dem viele Menschen ihre Ideen und ihr Wissen verknüpfen können. Während damals die wenigen Hochleistungsrechner in den Geheimdienstzentralen und IBM Laboren standen, gibt es heute völlig andere Methoden, um ein hohes Maß an Computerleistung zu erreichen. Diese reichen von der Nutzung der kompletten Hardware inkl. Grafikkarte, über Botnetze bis hin zu mietbaren Cloudlösungen.
Moderne Systeme erreichen dadurch heute weit höhere Werte beim Erraten („Brute Force“) von Passwörtern als damals. Vergleichsweise neue Techniken wie „Rainbow Tables“, die es damals einfach noch nicht gab verschärfen die Situation. Der Schlüsselraum von 8 Zeichen mit einem Zeichensatz von 102 Zeichen kann auf einem handelsüblichem Supercomputer innerhalb weniger Stunden durchprobiert werden. Das ist kein Puffer, auf den man sich verlassen sollte. Im Jahr 2011 sollte man diesen Standard endlich auf 12 Zeichen anheben, zumindest bis zum Jahr 2020.
Mythos: Ein drei Monate altes Passwort ist unsicher
Diesen Mythos lese ich mindestens genau so oft. Sagen wir, ich habe ein Passwort wie „!´5´0+Jfl+A§R?ZfAIF`D“, dann benötigt man, um dieses Passwort zu erraten bis zu 1,53 Septillion (42 Nullen) Versuche, was bei aktueller Rechenleistungen etwa 48,54 Trilliarden (21 Nullen) Jahre dauert. Inwiefern wird es sicherer, wenn ich es alle drei Monate austausche? Dieses Passwort kann man sich nicht merken. Niemand würde es auf Zettel schreiben oder eintippen.
Ein klarer Fall für einen Passwortmanager. Wenn ich dem nicht vertraue bzw. meinem eigenem Rechner, dann brauche ich auch kein sicheres Passwort, denn dann sind alle Versuche für mehr Sicherheit zum Scheitern verurteilt. Sobald ich einen Keylogger auf meinem System habe, kann ich das Passwort auch drei Mal am Tag ändern. Der potentielle Angreifer wird darüber jedes Mal informiert. Ein sicheres Passwort wird nicht unsicherer mit der Dauer seiner Verwendung.
Der einzige Schutz auch schon vorhandene Keylogger zu überlisten ist die Verwendung von One-Time-Passwörtern, die aber einen zweiten Kanal voraussetzen. Bekannt sind ja die Tan Generatoren der Banken und Sparkassen und was immer beliebter werden wird: Einmalpasswörter per SMS, wie Google das neuerdings macht. Dies kann man übrigens auch problemlos in die eigene Seite integrieren, aber es kostet derzeit immer noch einige Cent pro SMS. Da die Handyinfastruktur mittlerweile abbezahlt ist, hoffe ich ja immer noch, dass man zeitnah Flatrates bekommen kann. Aber so ganz glaube ich leider noch nicht dran.
Mythos: Passwortmanager sind unsicher
Noch ein Mythos, der sich hartnäckig hält. Passwortmanager, Bookmarklets und andere Hilfsmittel sind per Definition unsicher, weil sie meistens mit einem Masterpasswort arbeiten. Ist dieses Passwort bekannt, sind alle anderen Passwörter kompromitiert. Grundsätzlich ja, aber ohne Hilfsmittel kann man die Verwendung von sicheren Passwörtern zu den Akten legen, denn ich behaupte, kein Mensch ohne Inselbegabung kann sich mindestens zwölf Zeichen lange unterschiedliche Passwörter für dutzende Webseiten merken, und wenn doch, dann steckt da ein System hinter, was die Sicherheit nicht verbessert, z. B. indem der Name der Seite eingebaut wird. Auch gegen die Verwendung von Bookmarklets spricht nur mangelndes Vertrauen gegenüber dem Webseitenbetreiber. Und wenn ich dem nicht vertraue, sollte ich mich nicht anmelden.
Besonders häufig höre ich, dass der Passwortmanager von Firefox total unsicher sein soll. Warum? Weil es vor fast 5 Jahren mal die Möglichkeit gab, dass Phishing durch die Verwendung des Passwortmanagers begünstigt wurde. Dieses Problem wurde aber innerhalb weniger Wochen gelöst. Wenn Ihr auch hunderten Entwicklern, die regelmässig über den Code schauen nicht vertraut, zieht dem Stecker von diesem Internetz und steigt auf eine Wii um (natürlich ohne Wlan).
Mythos: Ganze Wörter in Passwörtern sind unsicher
Die Idee hinter diesem Mythos ist, dass ein Angreifer mit einer Wörterbuchattacke das Passwort erraten kann. Das ist bei einzelnen Wörtern sicher richtig, aber es wird auch gern vergessen zu erwähnen, dass man Wörter kombinieren kann. Bei Wikipedia steht wörtlich „Ein Passwort, welches nur aus ein oder zwei Wörtern besteht, ist daher bei der Verschlüsselung von Texten sehr unsicher“. Sagen wir mal, kommt drauf an.
Die deutsche Sprache ist sehr umfangreich und umfasst ca. 75.000 Grundwörter plus hunderttausender „Spezialwörter“. Gehen wir vom schlimmsten Fall aus – jedes Wort entspricht einem Zeichen und daher entspricht der Zeichensatz dem Wörterbuchumfang von 75.000. Nehmen wir jetzt weiter an, ich hätte das Passwort “HimmelundHölle”. Dieses Passwort besteht aus drei Wörtern, die garantiert in jedem Wörterbuch stehen. Trotzdem ist eine Wörterbuchattacke sinnlos, denn bei 189,22 Billiarden Möglichkeiten dauert die Berechnung des Schlüsselraums mit modernen Mitteln noch 6 Jahre. Eine Brute Force Attacke mit 6.3 Quadrillionen (24 Nullen) Möglichkeiten ist zwar noch aufwendiger, aber für eine Wörterbuchattacke muss man sicher sein, dass nur Wörter darin vorkommen und vor allem, dass die Wörter auch in diesem Wörterbuch stehen.
Was wäre, wenn ich Fachwörter wie jQuery oder MariaDB dazu nehme? Oder Eigennamen? Die Anzahl möglicher Wörter würde problemlos die 500.000 Marke übersteigen und wer sagt, dass ich nicht „HimmelUNDHölle“ schreibe oder weitere Zeichen dazu nehme wie „Himmel&Hölle!“. Wenn Ihr also das nächste Mal lest, dass man Passwörter immer aus den Anfangsbuchstaben der Wörter eines Satzes zusammen bauen soll, fragt den Schreiberling doch mal, warum man denn nicht den ganzen Satz nehmen kann. Übrigens, „geheim0815“ sollte man wirklich nicht verwenden, aber was spricht gegen „Geheim-NullAchtFünfzehn“?
Mythos: MD5 ist unsicher
Hashfunktionen wie MD5 sind dazu da, eine beliebige Zeichenkette oder eine Datei auf eine in der Länge und in den Zeichen festgelegte Zeichenkette „umzuschreiben“, um u. a. zu prüfen, ob eine Eingabe mit dem Original übereinstimmt ohne die gesamte ursprüngliche Zeichenkette vergleichen zu müssen. Im Web werden Hashes genutzt, um zu verhindern, dass ein Angreifer, der sich schon Zugriff auf eine Datenbank verschafft hat, auch noch die Passwörter der Benutzer ausliest. Der MD5 Wert einer Zeichenkette ist immer gleich. Sobald ich ein Zeichen verändere, verändert sich auch die gesamte Zeichenkette. Ein Rückwandlung zum Original ist im Gegensatz zu Verschlüsselungsverfahren wie AES nicht vorgesehen, allein schon weil Hashfunktionen grundsätzlich verlustbehaftet sind. Von 100.000 Zeichen bleiben nur 32 übrig bleiben und daraus kann man die 100.000 Zeichen unmöglich wiederherstellen.
Bereits vor 15 Jahren wurden in MD5 Schwachstellen gefunden, mit denen man Ursprungswerte so manipulieren kann, dass zwei gleiche Hashes heraus kommen. Das ist problematisch, weil man damit z. B. SSL Zertifikate fälschen konnte. Diese Verwundbarkeit wurde aber erst über 10 Jahre später wirklich demonstriert. Die Verwendung von MD5 bei SSL Zertifikaten gilt seitdem als unsicher. Aber was hat das mit dem Einsatz in unserer Datenbank zu tun? Richtig, nichts!
Die Verwendung von MD5 als Schutz für gespeicherte Passwörter ist sicher. Sagen wir ein Angreifer kennt unseren MD5 Hash und es wäre ihm möglich, eine Zeichenkette zu erzeugen, die genau diesen MD5 Wert hat. Hat er damit das Originalpasswort? Vermutlich nicht. Er kann sich evtl. bei genau dieser Anwendung mit der erzeugten Zeichenkette anmelden, aber sonst? Wenn er sowieso schon die Daten aus der Datenbank gezogen hat, warum sollte er das überhaupt wollen, wenn er seine Informationen nicht auf andere Webseiten wie E-Mail Anbieter oder Onlinebanking übertragen kann? Ausserdem muss man wissen, dass „möglich“ nicht „einfach“ bedeutet. Es wird viel Rechenleistung benötigt. Um tausende Onlinebankingkunden mit einem falschen SSL Zertifikat „abzuphishen“ lohnt der Aufwand, aber zum Erzeugen eines Passwortes, mit dem man sich vielleicht in Eurem Lieblingsforum für Waffelrezepte oder Häkelanleitungen anmelden kann? Eher nicht.
Mythos: MD5 ist sicher
Wer immer so einen Mist behauptet, hat keine Ahnung. MD5 ist nämlich unbrauchbar zum Schutz von gespeicherten Passwörtern und sollte niemals verwendet werden. Genau wie sha1, sha256 und sha512. Falls jetzt wer irritiert ist, die Erklärung ist ganz einfach.
$hash = md5 ( "test123" );
Diese Funktion ergibt immer den hash cc03e747a6afbbcbf8be7668acfebee5. Wenn das so ist, dann ist der Hash cc03e747a6afbbcbf8be7668acfebee5 ein sicheres Zeichen dafür, dass das Passwort test123 genommen wurde. Erstelle ich jetzt eine Datenbank, in der ich Millionen von Einträgen als Original und dem dazugehörigem MD5 Hash hinterlegt habe, dann kann ich mit sehr hoher Geschwindigkeit genau das erreichen, was nicht gehen sollte: Beliebige Hashes zurück rechnen. Diese sog. „Rainbow Tables“ sind es, die alle Hashverfahren zum Schutz von Passwörtern wertlos machen, denn es ist völlig unerheblich, ob ich für dieses Verfahren md5 oder sha512 benutze. Im Ergebnis ändert sich nur der Rechenaufwand, den ich betreiben muss.
MD5 ist, genau wie die SHA Funktionen darauf optimiert, auch große Zeichenketten möglichst effizient zu hashen, da man Sie auch für große Dateien einsetzt. Das ist z. B. dann wichtig, wenn man die Integrität einer Datei prüfen will. Beim Hashen von Passwörtern ist diese Eigenschaft eher kontraproduktiv, denn es optimiert unfreiweillig eine Brute-Force Attacke. Ob ein Verfahren sicher ist oder nicht entscheidet sich nicht in der Verwendung einer bestimmten Funktion, sondern (was auch sonst) in der Implementierung.
$hash = md5 ( "BeliebigeZeichenkette" . $passwort );
Verwende ich dieses Variante dann zwinge ich einen Angreifer den gesamten möglichen Schlüsselraum neu zu berechnen. Bereits vorhandene Rainbow Tables für MD5 sind wertlos. Ausserdem muss er den „Salt“ kennen und daher nicht nur Zugriff auf die Datenbank, sondern auch auf den Quelltext der darunter liegende Anwendung haben. Will man jetzt noch mehr Sicherheit, kann man diese Variante verwenden.
$hash = md5 ( "BeliebigeZeichenkette" . $passwort . $emaildesbenutzers );
Damit zwingt man einen Angreifer nicht nur den gesamten Schlüsselraum einmal neu zu berechnen, sondern für jeden Benutzer eine eigene Tabelle zu erzeugen. Ein Aufwand, der im richtigen Leben an der benötigten Rechenleistung scheitern wird und dieses Angriffsszenario weitgehend unbrauchbar macht. Dieses oder ähnliche Verfahren sind meiner Meinung nach das absolute Minimum, dass eine moderne Webanwendung im Bereich Passwortspeicherung können sollte.
Positiver Nebeneffekt: Sobald ein Benutzer seine E-Mail ändern will, muss er auch sein Passwort neu eingeben, das erhöht die Sicherheit vor XSS Attacken enorm. Wem das immer noch nicht reicht, der kann die benötigte Rechenleistung noch erhöhen, indem er diesen Wert mehrfach hasht.
$hash = md5 ( "BeliebigeZeichenkette" . $passwort . $emaildesbenutzers ); for($i = 0; $i < 1000000; $i++ ) $hash = md5 ( $hash );
Das Berechnen des Schlüsselraums für ein Passwort, z. B. von einem Administrator benötigt damit das 1.000.000-fache der ursprünglich nötigen Rechenleistung, was bei der Berechnung von Millionen möglicher Passwörter „hinderlich“ ist. Bei einem einzelnem Login führt es aber nur zu minimalen Verzögerungen. Um die Effizienz dieses Verfahrens in Zahlen auszudrücken. Eine Brute-Force Attacke auf das Passwort „geheim0815“ dauert auf oben erwähntem Supercomputer ca. 31 Minuten. Mit dem Faktor 1 Millionen erhöht man diese Zeit auf über 59 Jahre. In einem nicht repräsentativen Test auf meinem betagtem Laptop dauert die einmalige Berechnung etwa 500 ms.
Was lernen wir aus diesem Text?
Phishing ist lukrativer als Häkelforen! Und viel wichtiger, glaubt nicht jedem Pseudoexperten, der sich im Netz rumtreibt, schon gar nicht mir. Der größte Feind der eigenen Sicherheit ist in 99% aller Fälle nicht Unwissenheit, sondern pure Faulheit, denn ein gutes Sicherheitskonzept heißt, dass man sich zuerst einmal 30 Minuten Gedanken über das Thema macht. Es bedeutet nicht, sich ein Passwort auszudenken, für dass man Word starten muss und es bedeutet genau so wenig, dass man dieses sichere Passwort vier mal im Jahr ändern muss.
Ein sicheres Konzept fängt viel viel früher an. Verschlüsselte Daten, wo es nötig ist. Geeignete Hilfsmittel, wo man sie braucht und natürlich regelmässige Systempflege wie Updates und Virenprüfung. Das Wichtigste ist aber: Es muss benutzbar und komfortabel sein. Ein Passwortmanager, der nervt wird abgeschaltet – das ist einfach so. Überlegt Euch eine einfache Möglichkeit, um Eure Passwörter zu erzeugen. Das kann heißen, unmotiviert auf der Tastatur rumzuklimpern oder ein einfaches Javascript zu nutzen. Alternativ dazu funktionieren auch Programme wie pwgen. Dieses gibt es u. a. für Windows, Linux und als Firefoxplugin. Der beste Schutz vor geleakten Datenbanken ist aber immer noch, niemals ein Passwort zweimal zu benutzen.
Ich kenne kein einziges meiner Passwörter, ausser meinem Masterpasswort und dem Passwort meiner Festplattenverschlüsselung. Damit bin ich meiner Meinung nach auch schon völlig ausgelastet. Den Rest kann sich Firefox merken. Wenn Ihr Euch irgendwo aus welchem Grund auch immer nicht mehr anmelden könnt, lasst Euch ein neues Passwort schicken, dafür hat der Webmaster die Funktion ja eingebaut. Mit diesen einfachen Grundregeln im Hinterkopf seid Ihr schon besser geschützt als 90% aller anderen Internetnutzer.