{"id":4116,"date":"2013-04-02T10:09:08","date_gmt":"2013-04-02T08:09:08","guid":{"rendered":"https:\/\/www.herr-rau.de\/wordpress\/?p=4116"},"modified":"2013-04-13T15:33:59","modified_gmt":"2013-04-13T13:33:59","slug":"kryptographie-1-verschluesselung-von-passwoertern","status":"publish","type":"post","link":"https:\/\/www.herr-rau.de\/wordpress\/2013\/04\/kryptographie-1-verschluesselung-von-passwoertern.htm","title":{"rendered":"Kryptographie 1: Verschl\u00fcsselung von Passw\u00f6rtern"},"content":{"rendered":"<div style='text-align:right;'><small>(<a href='https:\/\/www.herr-rau.de\/wordpress\/2013\/04\/kryptographie-1-verschluesselung-von-passwoertern.htm#comments'>13 Kommentare.<\/a>)<\/small> <\/div><p><strong>Ein allgemeinbildender \u00dcberblick.<\/strong><\/p>\n<p>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\u00f6nnen. Auch wenn man in einem Onlinegesch\u00e4ft etwas einkauft, muss man meist diese Daten eingeben. In beiden F\u00e4llen \u00fcberpr\u00fcft das System daraufhin, ob Passwort und Benutzername korrekt sind, und l\u00e4sst den Benutzer erst danach weiter arbeiten.<\/p>\n<p>Damit das funktioniert, muss der Rechner zu Hause &#8211; oder der Rechner im Onlinegesch\u00e4ft &#8211; irgendwo eine Liste von Benutzernamen und Passw\u00f6rtern gespeichert haben, entweder in einer Datenbankdatei oder als einfache Textdatei:<\/p>\n<pre>Benutzer:        Passwort:\r\nadmin            admin1234\r\nrau              password\r\nhuber            geHeim!\r\nmueller          password<\/pre>\n<p>Das Problem ist dabei, dass jeder, der auf das System Zugriff hat &#8211; also mindestens der Systembetreuer &#8211; diese Passw\u00f6rter 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!<br \/>\nWer die Passwortliste also in dieser Form speichert, handelt \u00e4u\u00dferst fahrl\u00e4ssig und leichtfertig. Besser ist es, wenn man die Passw\u00f6rter in verschl\u00fcsselter Form speichert, etwa so:<\/p>\n<pre>Benutzer:        Passwort:\r\nadmin            benjo2345\r\nrau              qbttxpse\r\nhuber            hfIfjn\"\r\nmueller          qbttxpse<\/pre>\n<p>Der Benutzer &#8222;admin&#8220; tippt beim Anmelden immer noch sein altes Passwort &#8222;admin1234&#8220; ein, vor dem Vergleich mit dem verschl\u00fcsselt gespeicherten Passwort wird es aber erst verschl\u00fcsselt. Aus &#8222;admin1234&#8220; wird &#8211; bei der Verschl\u00fcsselung, die ich verwendet habe &#8211; &#8222;benjo2345&#8220;, und das wiederum passt zu der Information in der Datei, also wird die Anmeldung akzeptiert. <\/p>\n<p>Dieses System hat aber ebenfalls Nachteile. Nat\u00fcrlich muss man den verwendeten Schl\u00fcssel geheim halten. Au\u00dferdem sieht man, dass die Benutzer &#8222;rau&#8220; und &#8222;mueller&#8220; das gleiche Passwort haben, selbst wenn man es noch nicht kennt. Am schlimmsten: Wenn man die Passwortdatei analysiert, kann man den Schl\u00fcssel knacken &#8211; der ist n\u00e4mlich in meinem Fall nicht sehr gut, beim Verschl\u00fcsseln wird lediglich jeder Buchstabe ums eins verschoben: Aus &#8222;a&#8220; wird &#8222;b&#8220; und so weiter. Nat\u00fcrlich gibt es bessere Verschl\u00fcsselungsverfahren 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\u00e4lt. Es kann aber nicht jeder Systembetreuer ein Kryptographieexperte sein, und das Geheimhalten von Schl\u00fcsseln ist auch schwierig.<\/p>\n<p>Also greift man zu einer anderen L\u00f6sung, n\u00e4mlich einer <strong>kryptographischen Hash-Funktion<\/strong>. Das ist eine ver\u00f6ffentlichte Verschl\u00fcsselungsfunktion, 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.<\/p>\n<p>Wenn der Benutzer &#8222;rau&#8220; erstmalig sein Passwort eingibt, wendet man die Funktion SHA-1 darauf an (das ist die Verschl\u00fcsselung), und speichert das entstandene neue Passwort. Dann sieht meine Passwortdatei so aus:<\/p>\n<pre>Benutzer:        Passwort:\r\nadmin            7b902e6ff1db9f560443f2048974fd7d386975b0\r\nrau              5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8\r\nhuber            da5245eadd0e7be84735101f013eaea400e0ad43\r\nmueller          5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8<\/pre>\n<p>Wenn sich der Benutzer &#8222;rau&#8220; dann erneut anmeldet, gibt er sein Passwort ein. (Wir erinnern uns, das war &#8222;password&#8220;.) Das wird wieder mit SHA-1 verschl\u00fcsselt, wieder kommt &#8222;5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8&#8220; heraus, und *das* wird dann mit den gespeicherten Daten verglichen.<\/p>\n<p>Die so gespeicherte Datei bringt einem Dieb erst einmal gar nichts. Auch der Administrator kann aus der Datei das urspr\u00fcngliche Passwort nicht so einfach ablesen. Das liegt an einen wichtigen Eigenschaften dieser kryptographischen Hashfunktion:<\/p>\n<ul>\n<li>Jeder Hash ist gleich lang.<\/li>\n<li>Und zwar egal, wie lange das zu verschl\u00fcsselnde Passwort war.<\/li>\n<li>Man kann also von der L\u00e4nge des Hashwerts nicht auf die L\u00e4nge des Originalpasswort schlie\u00dfen.<\/li>\n<li>Man kann auch sonst von dem Hashwert nicht auf irgendwelche andere Eigenschaften des Originalpassworts schlie\u00dfen. 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.<\/li>\n<li>Das impliziert auch, dass Hashwerte f\u00fcr \u00e4hnliche W\u00f6rter trotzdem unvorhersagbar verschieden sind. Der Hash f\u00fcr &#8222;password&#8220; ist ein ganz anderer als f\u00fcr &#8222;passwort&#8220;.<\/li>\n<li>(F\u00fcr sp\u00e4ter 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\u00f6rter. Der Fachausdruck hei\u00dft &#8222;Kollision&#8220;, und davon h\u00e4tte man  gerne m\u00f6glichst wenige.)<\/li>\n<\/ul>\n<p>Die  SHA-1-Hashes in meiner Tabelle sind \u00fcbrigens alle genau 40 Zeichen lang, aber nicht irgendwelche beliebigen Zeichen. Tats\u00e4chlich besteht jeder Hash aus 20 Zahlen, wobei sich jede Zahl im Bereich von 0-255 befindet. Man k\u00f6nnte den &#8222;password&#8220;-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 &#8211; aber man schreibt das besser im Hexadezimalsystem, also eben: 5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8. Das ist f\u00fcr Informatiker lesbarer. Man sagt, der Hash ist 20 Byte lang &#8211; ein Byte entspricht einer Zahl von 0-255 und ist die Universaleinheit beim Computern. <\/p>\n<p>Wie genau diese Hashfunktionen funktionieren, geh\u00f6rt 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.<\/p>\n<p>Warum sind diese Funktionen \u00f6ffentlich und kein streng geh\u00fctetes Geheimnis? Zum einen f\u00fchrt das dazu, dass jeder sie verwenden kann. Vor allem erm\u00f6glicht das auch der ganzen Welt, zu testen, ob die Funktionen auch halten, was sie versprechen. Gerade diese \u00d6ffentlich- und \u00dcberpr\u00fcfbarkeit f\u00fchrt zu Sicherheit. Und au\u00dferdem neigen streng geh\u00fctete Geheimnisse dazu, fr\u00fcher oder sp\u00e4ter ohnehin herauszukommen, so dass man sich nicht auf sie verlassen sollte, wenn es um Sicherheit geht.<\/p>\n<p><strong>Was man mit einer gestohlenen Passwortdatei anfangen kann, auch wenn die Daten verschl\u00fcsselt sind.<\/strong><\/p>\n<p>Selbst wenn die Passw\u00f6rter mit SHA-1 oder einer anderen kryptographischen Hashfunktion verschl\u00fcsselt sind, kann man noch einiges damit anfangen. Man kann versuchen, die Passw\u00f6rter zu knacken. Dazu gibt es mehrere M\u00f6glichkeiten:<\/p>\n<ol>\n<li><strong>Brute Force:<\/strong> Man probiert einfach alle theoretisch denkbaren Passw\u00f6rter der Reihe nach aus und vergleicht deren Hashwert mit dem gespeicherten Wert. Fr\u00fcher oder sp\u00e4ter f\u00fchrt das zum Erfolg, vor allem bei kurzen Passw\u00f6rtern. Bei langen Passw\u00f6rtern dauert das aber lange, so dass man mit Brute Force nicht weit kommt. Bei einem Alphabet von 70 Zeichen (gro\u00df, klein, Ziffern) gibt es immerhin schon 580.000 Milliarden Passw\u00f6rter der L\u00e4nge 8. Aber auch das schafft ein Rechner in zwei Wochen. Wenn man nur auf Kleinbuchstaben testet, reduziert sich die Zahl auf 208 Milliarden &#8211; eine Sache von Minuten. <\/li>\n<li><strong>W\u00f6rterbuchangriff:<\/strong> Statt Passw\u00f6rter zu raten, geht man einfach ein W\u00f6rterbuch durch. So ein W\u00f6rterbuch hat vieleicht eine halbe Million W\u00f6rter. Das W\u00f6rterbuch erweitert man dann um eine Liste bekannter und beliebter Passw\u00f6rter. Dazu nimmt man ein paar typische Ersatzregeln &#8211; eine &#8222;1&#8220; statt einem &#8222;i&#8220;, eine &#8222;3&#8220; statt einem &#8222;E&#8220; und noch ein paar Varianten. Damit w\u00e4chst das W\u00f6rterbuch auf einige Milliarden Eintr\u00e4ge an, aber die durchzugehen ist f\u00fcr einen Rechner gut machbar.<\/li>\n<li>W\u00e4re es nicht sch\u00f6n, wenn es irgendwo eine Liste von h\u00e4ufigen Hashes mit Klartextl\u00f6sungen dazu g\u00e4be, und man tippte nur den Hashwert ein, und in der Liste w\u00fcrde dann nach dem entsprechenden Klartext gesucht? Gibt es nat\u00fcrlich. Das Passwort &#8222;password&#8220; w\u00e4re schon bei einem W\u00f6rterbuchangriff geknackt worden, aber ohnehin hat es sich herumgesprochen, dass der SHA1-Hash &#8222;5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8&#8220; 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\u00dferdem in sogenannten <a href=\"https:\/\/de.wikipedia.org\/wiki\/Rainbow_Table\">Rainbow Tables<\/a> gesammelt. Ganz einfach ist das nicht, da es 256^20 verschiedene SHA1-Hashes gibt. Milliarden ist kein Ausdruck daf\u00fcr, die Zahl hat 48 Nullen hinten dran. Die kann man nicht einfach mal alle speichern oder durchsuchen.<\/li>\n<\/ol>\n<p><strong>Wie man seine Passwortdatei sicherer machen kann.<\/strong><\/p>\n<p>Bekanntlich ist das Passwort &#8222;password&#8220; nicht sicher, weil dessen Hash bekannt ist. Das gleiche gilt f\u00fcr &#8222;admin&#8220; und viele andere h\u00e4ufig verwendete Passw\u00f6rter. Also gibt es das Konzept des &#8222;salting&#8220;.<\/p>\n<p>Dabei wird jedes Benutzerpasswort (ohne dass der Benutzer das mitkriegt) automatisch um einige Zeichen erg\u00e4nzt, das sogenannte &#8222;salt&#8220;. Nimmt man als <em>salt<\/em> &#8222;Ab!4&#8220;, wird das d\u00e4mliche Benutzerpasswort &#8222;password&#8220; automatisch vor dem Umwandeln zu &#8222;passwordAb!4&#8220; erg\u00e4nzt, dessen Hash dann eben nicht das altbekannte &#8222;5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8&#8220; ist. Das <em>salt<\/em> muss man nat\u00fcrlich jedesmal erg\u00e4nzen, wenn ein Benutzer sich mit seinem Passwort anmeldet. Nat\u00fcrlich sollte ein besseres <em>salt<\/em> gew\u00e4hlt werden als in meinem Beispiel.<\/p>\n<p>Au\u00dferdem kann man f\u00fcr jeden Benutzer ein individuelles <em>salt<\/em> speichern. Gut, in beiden F\u00e4llen darf das <em>salt<\/em> nat\u00fcrlich nicht bekannt werden. Aber man gewinnt dadurch echt unbekannte Hashes, und die individuellen Salts f\u00fchren dazu, dass f\u00fcr zwei Benutzer mit dem gleichen Passwort trotzdem unterschiedliche Hashes gespeichert werden &#8211; eben weil zu dem Passwort noch die individuellen <em>salts<\/em> dazu geh\u00f6ren.<\/p>\n<p>Ich f\u00fchre das \u00fcbrigens nur wegen der Etymologie an. Laut einer Theorie hei\u00dft <em>salt<\/em> so, weil man das bei der Umwandlung des Originals in den Hashtext hinzuf\u00fcgt. Und &#8222;hash&#8220; ist ein Gericht aus Kartoffeln und Hackfleisch oder Corned Beef, bei dessen Zubereitung man nat\u00fcrlich auch Salz hinzuf\u00fcgt. Vielleicht kommt das Wort auch aus dem Konzept &#8222;salting a mine&#8220;. Dem bin ich mal in einem alten Perry-Mason-Krimi begegnet. Dabei platziert man, sagen wir, ein paar St\u00fccke Golderz in einer ansonst wertlosen Mine, um einem prospektiven K\u00e4ufer vorzugaukeln, es handle sich um eine produktive Mine, in der es noch Erz abzubauen gibt.<\/p>\n<p><strong>Wie man an Passwortdateien kommt<\/strong><\/p>\n<p>Wei\u00df ich nicht. Diebstahl? Social Engineering? An die Datei mit den verschl\u00fcsselten Benutzerpassworten von Windows heranzukommen ist jedenfalls nur m\u00e4\u00dfig schwer, wenn man Zugang zum Rechner hat. F\u00fcrs Entschl\u00fcsseln gibt es dann hilfreiche Programme, etwa <a href=\"http:\/\/de.wikipedia.org\/wiki\/John_the_Ripper\">John the Ripper<\/a>, das automatisch W\u00f6rterbuch- und Brute-Force-Angriffe ausf\u00fchrt. Die Verbreitung dieser Programme ist in Deutschland rechtlich problematisch &#8211; man darf sie nur zum Guten weitergeben und verwenden.<\/p>\n<p>(Ganz einfach kommt man an Passw\u00f6rter, wenn diese unverschl\u00fcsselt \u00fcbertragen werden, also via http statt https. Dann kann ein Rechner im \u00f6rtlichen Netzwerk oder eine Zwischenstation auf dem Weg zum Empf\u00e4nger das mitlesen.)<\/p>\n<p><strong>Wie man sein Passwort sicher macht.<\/strong><\/p>\n<p>Der Vollst\u00e4ndigkeit halber: F\u00fcr jeden Dienst ein anderes Passwort verwenden. Kein kurzes Passwort nehmen, das durch Brute Force geknacht werden kann. Kein Passwort, das eine W\u00f6rterbuchattacke nicht \u00fcbersteht. Kein Passwort, das andere Leute auch verwenden. Darauf hoffen, dass der Onlinedienst die Passw\u00f6rter ordentlich verschl\u00fcsselt.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>(13 Kommentare.) Ein allgemeinbildender \u00dcberblick. 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\u00f6nnen. Auch wenn man in einem Onlinegesch\u00e4ft etwas einkauft, muss man meist diese Daten eingeben. In beiden F\u00e4llen \u00fcberpr\u00fcft das System daraufhin, ob [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[25],"tags":[227],"class_list":["post-4116","post","type-post","status-publish","format-standard","hentry","category-informatik","tag-informatik"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"jetpack_likes_enabled":true,"_links":{"self":[{"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/posts\/4116","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/comments?post=4116"}],"version-history":[{"count":1,"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/posts\/4116\/revisions"}],"predecessor-version":[{"id":4118,"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/posts\/4116\/revisions\/4118"}],"wp:attachment":[{"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/media?parent=4116"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/categories?post=4116"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/tags?post=4116"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}