Kryptographie 1: Verschlüsselung von Passwörtern

Ein allgemeinbildender Überblick.

Bei vielen Rechnern zu Hause oder in der Schule ist es so, dass man sich mit einem Benutzernamen und einem Passwort anmelden muss, um damit arbeiten zu können. Auch wenn man in einem Onlinegeschäft etwas einkauft, muss man meist diese Daten eingeben. In beiden Fällen überprüft das System daraufhin, ob Passwort und Benutzername korrekt sind, und lässt den Benutzer erst danach weiter arbeiten.

Damit das funktioniert, muss der Rechner zu Hause – oder der Rechner im Onlinegeschäft – irgendwo eine Liste von Benutzernamen und Passwörtern gespeichert haben, entweder in einer Datenbankdatei oder als einfache Textdatei:

Benutzer:        Passwort:
admin            admin1234
rau              password
huber            geHeim!
mueller          password

Das Problem ist dabei, dass jeder, der auf das System Zugriff hat – also mindestens der Systembetreuer – diese Passwörter einsehen und missbrauchen kann. Und wenn diese Liste gar gestohlen wird, kann der Dieb sie ebenso missbrauchen. Um so schlimmer, wenn die Benutzer das gleiche Passwort bei anderen Systemen auch noch einsetzen!
Wer die Passwortliste also in dieser Form speichert, handelt äußerst fahrlässig und leichtfertig. Besser ist es, wenn man die Passwörter in verschlüsselter Form speichert, etwa so:

Benutzer:        Passwort:
admin            benjo2345
rau              qbttxpse
huber            hfIfjn"
mueller          qbttxpse

Der Benutzer „admin“ tippt beim Anmelden immer noch sein altes Passwort „admin1234“ ein, vor dem Vergleich mit dem verschlüsselt gespeicherten Passwort wird es aber erst verschlüsselt. Aus „admin1234“ wird – bei der Verschlüsselung, die ich verwendet habe – „benjo2345“, und das wiederum passt zu der Information in der Datei, also wird die Anmeldung akzeptiert.

Dieses System hat aber ebenfalls Nachteile. Natürlich muss man den verwendeten Schlüssel geheim halten. Außerdem sieht man, dass die Benutzer „rau“ und „mueller“ das gleiche Passwort haben, selbst wenn man es noch nicht kennt. Am schlimmsten: Wenn man die Passwortdatei analysiert, kann man den Schlüssel knacken – der ist nämlich in meinem Fall nicht sehr gut, beim Verschlüsseln wird lediglich jeder Buchstabe ums eins verschoben: Aus „a“ wird „b“ und so weiter. Natürlich gibt es bessere Verschlüsselungsverfahren als diese Verschiebechiffren. Aber auch die sind nicht so viel schwerer zu knacken, wenn man nicht als Kryptographieexperte eine eigene Chiffriermethode entwickelt und diese dann erfolgreich geheim hält. Es kann aber nicht jeder Systembetreuer ein Kryptographieexperte sein, und das Geheimhalten von Schlüsseln ist auch schwierig.

Also greift man zu einer anderen Lösung, nämlich einer kryptographischen Hash-Funktion. Das ist eine veröffentlichte Verschlüsselungsfunktion, die man also nicht geheimhalten muss, und die trotzdem schwer zu knacken ist. Davon gibt es einige, etwa MD5 oder SHA-1 oder SHA-256; meine Beispiele sind alle SHA-1.

Wenn der Benutzer „rau“ erstmalig sein Passwort eingibt, wendet man die Funktion SHA-1 darauf an (das ist die Verschlüsselung), und speichert das entstandene neue Passwort. Dann sieht meine Passwortdatei so aus:

Benutzer:        Passwort:
admin            7b902e6ff1db9f560443f2048974fd7d386975b0
rau              5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8
huber            da5245eadd0e7be84735101f013eaea400e0ad43
mueller          5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8

Wenn sich der Benutzer „rau“ dann erneut anmeldet, gibt er sein Passwort ein. (Wir erinnern uns, das war „password“.) Das wird wieder mit SHA-1 verschlüsselt, wieder kommt „5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8“ heraus, und *das* wird dann mit den gespeicherten Daten verglichen.

Die so gespeicherte Datei bringt einem Dieb erst einmal gar nichts. Auch der Administrator kann aus der Datei das ursprüngliche Passwort nicht so einfach ablesen. Das liegt an einen wichtigen Eigenschaften dieser kryptographischen Hashfunktion:

  • Jeder Hash ist gleich lang.
  • Und zwar egal, wie lange das zu verschlüsselnde Passwort war.
  • Man kann also von der Länge des Hashwerts nicht auf die Länge des Originalpasswort schließen.
  • Man kann auch sonst von dem Hashwert nicht auf irgendwelche andere Eigenschaften des Originalpassworts schließen. Man kann daran zum Beispiel nicht erkennen, ob es darin viele Vokale gibt, oder wie viele Sonderzeichen, oder ob manche Zeichen mehrfach vorkommen oder nicht.
  • Das impliziert auch, dass Hashwerte für ähnliche Wörter trotzdem unvorhersagbar verschieden sind. Der Hash für „password“ ist ein ganz anderer als für „passwort“.
  • (Für später mal: Es folgt auch aus all dem, dass es zu einem gegebenen Hashwert bei einer gegebenen Hashfunktion nicht nur ein Originalpasswort gibt, das diesen Hashwert erzeugt, sondern beliebig viele davon. Klar: Es gibt nur endlich viele Hashwerte, aber im Prinzip unendlich viele, weil beliebig lange, Passwörter. Der Fachausdruck heißt „Kollision“, und davon hätte man gerne möglichst wenige.)

Die SHA-1-Hashes in meiner Tabelle sind übrigens alle genau 40 Zeichen lang, aber nicht irgendwelche beliebigen Zeichen. Tatsächlich besteht jeder Hash aus 20 Zahlen, wobei sich jede Zahl im Bereich von 0-255 befindet. Man könnte den „password“-Hash also auch so schreiben: 091.170.097.228.201.185.063.063.006.130.037.011.108.248.051.027.126.230.143.216 – aber man schreibt das besser im Hexadezimalsystem, also eben: 5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8. Das ist für Informatiker lesbarer. Man sagt, der Hash ist 20 Byte lang – ein Byte entspricht einer Zahl von 0-255 und ist die Universaleinheit beim Computern.

Wie genau diese Hashfunktionen funktionieren, gehört nicht mehr zur Allgemeinbildung, also nicht hierher. Der Knackpunkt ist, dass es relativ leicht ist, aus einem Eingabewert (etwa dem Passwort) den Hashwert zu berechnen, aber sehr, sehr schwer, zu einem gegebenen Hashwert ein Wort zu finden, das diesem entspricht.

Warum sind diese Funktionen öffentlich und kein streng gehütetes Geheimnis? Zum einen führt das dazu, dass jeder sie verwenden kann. Vor allem ermöglicht das auch der ganzen Welt, zu testen, ob die Funktionen auch halten, was sie versprechen. Gerade diese Öffentlich- und Überprüfbarkeit führt zu Sicherheit. Und außerdem neigen streng gehütete Geheimnisse dazu, früher oder später ohnehin herauszukommen, so dass man sich nicht auf sie verlassen sollte, wenn es um Sicherheit geht.

Was man mit einer gestohlenen Passwortdatei anfangen kann, auch wenn die Daten verschlüsselt sind.

Selbst wenn die Passwörter mit SHA-1 oder einer anderen kryptographischen Hashfunktion verschlüsselt sind, kann man noch einiges damit anfangen. Man kann versuchen, die Passwörter zu knacken. Dazu gibt es mehrere Möglichkeiten:

  1. Brute Force: Man probiert einfach alle theoretisch denkbaren Passwörter der Reihe nach aus und vergleicht deren Hashwert mit dem gespeicherten Wert. Früher oder später führt das zum Erfolg, vor allem bei kurzen Passwörtern. Bei langen Passwörtern dauert das aber lange, so dass man mit Brute Force nicht weit kommt. Bei einem Alphabet von 70 Zeichen (groß, klein, Ziffern) gibt es immerhin schon 580.000 Milliarden Passwörter der Länge 8. Aber auch das schafft ein Rechner in zwei Wochen. Wenn man nur auf Kleinbuchstaben testet, reduziert sich die Zahl auf 208 Milliarden – eine Sache von Minuten.
  2. Wörterbuchangriff: Statt Passwörter zu raten, geht man einfach ein Wörterbuch durch. So ein Wörterbuch hat vieleicht eine halbe Million Wörter. Das Wörterbuch erweitert man dann um eine Liste bekannter und beliebter Passwörter. Dazu nimmt man ein paar typische Ersatzregeln – eine „1“ statt einem „i“, eine „3“ statt einem „E“ und noch ein paar Varianten. Damit wächst das Wörterbuch auf einige Milliarden Einträge an, aber die durchzugehen ist für einen Rechner gut machbar.
  3. Wäre es nicht schön, wenn es irgendwo eine Liste von häufigen Hashes mit Klartextlösungen dazu gäbe, und man tippte nur den Hashwert ein, und in der Liste würde dann nach dem entsprechenden Klartext gesucht? Gibt es natürlich. Das Passwort „password“ wäre schon bei einem Wörterbuchangriff geknackt worden, aber ohnehin hat es sich herumgesprochen, dass der SHA1-Hash „5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8“ diesem Passwort entspricht. Es gibt Listen solcher bekannter Hashes, und wenn man ein Passwort verwendet, das irgendwer sonst auf der Welt noch verwendet, und dessen Passwort wird bekannt, dann landet der entsprechende Hash vielleicht auf diesen Listen. Systematisch werden Hashes außerdem in sogenannten Rainbow Tables gesammelt. Ganz einfach ist das nicht, da es 256^20 verschiedene SHA1-Hashes gibt. Milliarden ist kein Ausdruck dafür, die Zahl hat 48 Nullen hinten dran. Die kann man nicht einfach mal alle speichern oder durchsuchen.

Wie man seine Passwortdatei sicherer machen kann.

Bekanntlich ist das Passwort „password“ nicht sicher, weil dessen Hash bekannt ist. Das gleiche gilt für „admin“ und viele andere häufig verwendete Passwörter. Also gibt es das Konzept des „salting“.

Dabei wird jedes Benutzerpasswort (ohne dass der Benutzer das mitkriegt) automatisch um einige Zeichen ergänzt, das sogenannte „salt“. Nimmt man als salt „Ab!4“, wird das dämliche Benutzerpasswort „password“ automatisch vor dem Umwandeln zu „passwordAb!4“ ergänzt, dessen Hash dann eben nicht das altbekannte „5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8“ ist. Das salt muss man natürlich jedesmal ergänzen, wenn ein Benutzer sich mit seinem Passwort anmeldet. Natürlich sollte ein besseres salt gewählt werden als in meinem Beispiel.

Außerdem kann man für jeden Benutzer ein individuelles salt speichern. Gut, in beiden Fällen darf das salt natürlich nicht bekannt werden. Aber man gewinnt dadurch echt unbekannte Hashes, und die individuellen Salts führen dazu, dass für zwei Benutzer mit dem gleichen Passwort trotzdem unterschiedliche Hashes gespeichert werden – eben weil zu dem Passwort noch die individuellen salts dazu gehören.

Ich führe das übrigens nur wegen der Etymologie an. Laut einer Theorie heißt salt so, weil man das bei der Umwandlung des Originals in den Hashtext hinzufügt. Und „hash“ ist ein Gericht aus Kartoffeln und Hackfleisch oder Corned Beef, bei dessen Zubereitung man natürlich auch Salz hinzufügt. Vielleicht kommt das Wort auch aus dem Konzept „salting a mine“. Dem bin ich mal in einem alten Perry-Mason-Krimi begegnet. Dabei platziert man, sagen wir, ein paar Stücke Golderz in einer ansonst wertlosen Mine, um einem prospektiven Käufer vorzugaukeln, es handle sich um eine produktive Mine, in der es noch Erz abzubauen gibt.

Wie man an Passwortdateien kommt

Weiß ich nicht. Diebstahl? Social Engineering? An die Datei mit den verschlüsselten Benutzerpassworten von Windows heranzukommen ist jedenfalls nur mäßig schwer, wenn man Zugang zum Rechner hat. Fürs Entschlüsseln gibt es dann hilfreiche Programme, etwa John the Ripper, das automatisch Wörterbuch- und Brute-Force-Angriffe ausführt. Die Verbreitung dieser Programme ist in Deutschland rechtlich problematisch – man darf sie nur zum Guten weitergeben und verwenden.

(Ganz einfach kommt man an Passwörter, wenn diese unverschlüsselt übertragen werden, also via http statt https. Dann kann ein Rechner im örtlichen Netzwerk oder eine Zwischenstation auf dem Weg zum Empfänger das mitlesen.)

Wie man sein Passwort sicher macht.

Der Vollständigkeit halber: Für jeden Dienst ein anderes Passwort verwenden. Kein kurzes Passwort nehmen, das durch Brute Force geknacht werden kann. Kein Passwort, das eine Wörterbuchattacke nicht übersteht. Kein Passwort, das andere Leute auch verwenden. Darauf hoffen, dass der Onlinedienst die Passwörter ordentlich verschlüsselt.

13 Antworten auf „Kryptographie 1: Verschlüsselung von Passwörtern“

  1. Ja, ich denke auch, dass Comic und Artikel in die gleiche Richtung zielen. Ich mus den Comic mal meinen Schülern zeigen, sie überhaupt mal nach ihren Passwortgewohnheiten fragen.

  2. Mhh, etwas Wichtiges fehlt noch: SHA1 oder MD5 sind heutzutage auch mit Salt (+ evtl. Pepper) ungeeignet für das Speichern von Passwörtern, da sie zu einfach und vor allem zu schnell zu berechnen sind. Wenn sich die Verwendung von SHA1 oder MD5 nicht verhindern lässt, sollte man die Funktionen mindestens mit ein paar tausend Iterationen hintereinander auf die gesalzenen Passwörter anwenden.
    Hintergrund ist folgender: Moderne Grafikarten sind in der Lage, etliche Milliarden Hashes pro Sekunde (MD5) zu bruteforcen (Salt spielt hier dann keine Rolle mehr). Mit diesen Verfahren bekommt man derzeit eigentlich alle Passwörter (auch gesalzen) mit unter 9 Zeichen Länge in ein paar Stunden heraus.
    Deswegen für das Hashen von Passwörtern immer langsame rundenbasierte Hashfunktionen wie Blowfish oder das neue SHA-3 (alias Keccak) benutzen.
    Am besten sind natürlich generell lange Passwörter, aber das wurde ja schon von XKCD aufgegriffen :-)

  3. Als ich den Inhalt des Blogeintrags vor dem Schreiben Frau Rau erklären wollte, war diese schon da nicht mehr völlig aufmerksam… deshalb habe ich etliche Details weggelassen, etwa das Iterieren oder die empfohlene Länge für Salts. Danke für die Ergänzung. Wichtig ist jedenfalls, dass manche dieser Hashfunktionen theoretisch oder praktisch nicht mehr ganz sicher sind und man deswegen auf andere umsteigen sollte.

  4. Schüler nach ihren Passwortgewohnheiten fragen…. da kommt ganz was schlimmes raus. Manche benutzen nur einen einzigen Buchstaben, andere so laaaaange Sätze, dass sie ihn nicht mehr hinbekommen. Ich empfehle daher für das Schulnetzwerk so etwas wie Vorname und Nachname des Vaters zusammen mit seinem Geburtstag. Denn letzteres kennt kaum ein Schüler vom anderen.

  5. In einer der jüngeren c´t Ausgaben war ja auch ein Artikel zur Verschlüsselung – wenn auch deutlich komplizierter („Grundwissen“ vorausgesetzt).
    Trotz aller Erklärungen und Tipps zum Thema sichere Passwörter & Verschlüsselung:
    – Warum erlauben manche Internetanbieter keine Sonderzeichen bei der PW-Erstellung (oftmals nur Zahlen, Buchstaben, Satzzeichen)?
    – Warum ist bei manchen Internetdiensten (auch solchen, die durchaus sensible Informationen beinhalten) die Zeichenzahl begrenzt?

    Kann mir das jemand erklären?

  6. Ist mir auch schon begegnet. Die Antwort weiß ich nicht, aber die Frage haben sich schon mal andere gestellt:

    http://answers.yahoo.com/question/index?qid=20080305084526AAATGcZ
    http://stackoverflow.com/questions/98768/should-i-impose-a-maximum-length-on-passwords

    Fazit: Man weiß es nicht. Als Vorbeugung gegen einen Buffer Overflow bei einem Angriff mit zu langer Eingabe? Wegen darunterliegender alter Software? Damit sich der Benutzer das Passwort leichter merken kann?
    Bei Zeichen, die nicht unter den ersten 128 ASCII-Zeichen sind, muss bei der Speicherung und Überprüfung das Zeichen-Format angegeben sein, etwa UTF-8, sonst kann das Zeichen unter Umständen falsch interpretiert-gespeichert werden. Aber das darf es eigentlich auch nicht sein.

  7. Bitte nicht Hash mit Verschlüsselung verwechseln!

    Eine Verschlüsselung ist umkehrbar (man benötigt dazu einen Schlüssel), eine Hash-Funktion (z.B. MD5, SHA-…) funktioniert jedoch nur in eine Richtung (Einwegfunktion), und kann daher selbst von den Administratoren einer Seite nicht wieder in Klartext verwandelt werden.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.