Passwörter + Hashes

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Passwörter + Hashes

    Joa...

    ich hab mich in letztet Zeit erkundigt wegen Passwörter-Hack, Brute-Force, Dictionary Attack und bin schließlich auf die Rainbow tables gekommen.

    Habe eigentlich sogut wie jedes Prinzip, Alogrithmus und so verstanden und wollte trotzdem fragen:

    Bei den Rainbow Tables wird ein String und der dazu gehörige Hash generiert und abgespeichert.
    ein Hash besteht normal aus 32 Zeichen = 32 byte..habe aber mal wo gelesen dass es mit 16 byte hashes auch geht?
    Sollte das dann so laufen...es werden alle Wörter mit nur 16 Byte Hashes generiert (verringert die Speichermenge, verringert die Erstellungszeit der Tabellen) und wenn nun ein Hash mit dem 16er Hash übereinstimmt wird der ganze Hash nochmal generiert und es wird nochmal verglichen und dies mit allen 16er hashes die passen.

    wenn das so stimmt..wäre es sinnvoller oder verbraucht man dann mehr rechenzeit?

    Und noch eine Frage:

    Werden lokale Passwörter (von einem x-beliebigen programm mit passwort-abfrage) in hash-werten gespeichert? oder im klartext?
    Online werden alle Passwörter (Login-Interfaces) in Hashes gespeichert soweit ich weiß.
  • Also erstmal: Wie groß (also wieviele Zeichen) ein Hash ist, hängt einzig und allein vom Hash-Algorithmus ab. Wenn ein Algorithmus 128Bit Hashes erzeugt, dann haben alle Hashes dieses Algorithmuses 128Bit. Man kann sich also nicht aussuchen ob man jetzt ein 16Byte oder 32Byte Hash haben will. Und die Hashes drückt man in der Regel auch nicht als "normale" Zeichenketten aus, sondern stellt sie in Hexadezimal-Schreibweise dar.

    Werden lokale Passwörter (von einem x-beliebigen programm mit passwort-abfrage) in hash-werten gespeichert? oder im klartext?

    Das kommt auf das x-beliebige Programm an. Passwörter im Klartext zu speichern ist allgemein sehr schlechter Stil, aber es gibt durchaus Programme die es machen. Es kommt aber auch stark darauf an, was das Programm mit den Passwörtern macht. Windows z.B. speichert die Benutzeraccount Passwörter als Hash, da er ja nur überprüfen muss, ob ein eingegebenes Passwort dem gespeicherten entspricht. Anders ist es bei E-Mail-Clients und Webbrowsern, die Passwörter von E-Mail-Accounts und Webseiten speichern. In diesem Falle kann man sie nicht nur als Hash speichern, da das Programm ja in der Lage sein muss, das Passwort zum einloggen wieder komplett zu rekonstruieren.

    Online werden alle Passwörter (Login-Interfaces) in Hashes gespeichert soweit ich weiß.

    Das sollten sie zwar, aber sicher kann man sich dabei nie sein. Es hängt einzig allein vom Programmierer der Seite (oder der verwendeten Software) ab, wie die Passwörter auf Webseiten gespeichert werden.
  • Die 32Byte werden oft im Zusammenhang mit MD5 genannt, das liegt aber nur daran, das die meisten MD5-Hashes als String (ein Byte pro Character) abgespeichern und nicht als hexadezimaler Wert (Halbes Byte pro Character). Rainbowtables sind der Mittelweg aus berechnen und abspeichern. Einen Hash mittels Rainbowtables zu knacken dauert erheblich länger als wenn man eine Tabelle hat, in der alle Buchstabenkombinationen (bis n Zeichen) und die dazugehörigen Hashes stehen, dafür benötigen diese nur ein Bruchteil an Speicherplatz.

    Der wesentliche Trick ist die Reduktion(sfunktion). Eine Rainbow-Table besteht aus Ketten z.B. mit 1000 Gliedern. In der Datenbank steht zu jeder Kette nur das erste Passwort und er Hash dazu. Die Reduktion macht aus dem Hash einen eindeutigen anderen String z.b. der Länge 16 und daraus wieder einen Hash und wieder eine Reduktion und wieder ein hash. Solange bis ein Hash schonmal dran war oder die 1000 voll sind. In der Tabelle stehen dann das erste und der letzte Glied der Kette. Wenn man nun einen Hash knacken will, führt man die Reduktionsfunktion aus und hasht es wieder usw. bis man bei einem String ist, den man als letztes Glied irgendwo gespeichert hat. Wenn man das gefunden hat, nimmt man das erste Glied zu der Kette und berechnet die Kette erneut durch. Dann muss man zwangsläufig auf ein Wort stoßen, dass diesen Hash erzeugt.

    Ich hoffe das war verständlich erklärt, sonst am besten nochmal bei Wikipedia nachlesen.
    ~ mfg SeBa

    Ich beantworte keine PMs zu Computer-/Programmierproblemen. Bitte wendet euch an das entsprechende Forum.

    [Blockierte Grafik: http://i.creativecommons.org/l/by-sa/3.0/80x15.png]
  • SeBa schrieb:


    Der wesentliche Trick ist die Reduktion(sfunktion). Eine Rainbow-Table besteht aus Ketten z.B. mit 1000 Gliedern. In der Datenbank steht zu jeder Kette nur das erste Passwort und er Hash dazu. Die Reduktion macht aus dem Hash einen eindeutigen anderen String z.b. der Länge 16 und daraus wieder einen Hash und wieder eine Reduktion und wieder ein hash. Solange bis ein Hash schonmal dran war oder die 1000 voll sind. In der Tabelle stehen dann das erste und der letzte Glied der Kette. Wenn man nun einen Hash knacken will, führt man die Reduktionsfunktion aus und hasht es wieder usw. bis man bei einem String ist, den man als letztes Glied irgendwo gespeichert hat. Wenn man das gefunden hat, nimmt man das erste Glied zu der Kette und berechnet die Kette erneut durch. Dann muss man zwangsläufig auf ein Wort stoßen, dass diesen Hash erzeugt.


    Also das heißt z.b. :

    In der Tabelle stehen 1000 Wörter mit den dazugehörigen Hashes. Nun wird eine Reduktionsfunktion ausgeführt und der Hash wird z.b. auf 16 Byte gebracht. Danach kommt wieder eine Reduktionsfunktion ins Spiel und es werden daraus 8 Byte solange bis alle wörter dran waren.
    Was ich nicht verstehe, was heißt in der Tabelle stehen das erste und das letzte Glied der Kette. <<--- Welches Glied von welcher Kette? Habs auf Wiki auch schon gelesen und nicht kapiert, steht zwar ne zeichnung dabei aber ich check es nicht. ^^

    Geht es nicht einfach so dass man alle Wörter jetzt z.b. auf 8 Byte bringt (also die Hashwerte). Wenn nun nach einen Hash gesucht wird, nimmt man alle Hashes her, die übereinstimmen können und diese werden neu berechnet (auf 32 Byte) und verglichen?
    Das spart Zeit bei der Herstellung solcher Tabellen und verringert die Speicherkapazität, erhöht aber beim Suchen und erstellen der Hashwerte wieder die Rechenzeit, die aber sicher minimal ist als wenn man alle Hashwerte auf 32Byte speichert.

    Hätte ich da Recht dass man es machen könnte und würde auch einiges einsparen? (abgesehen von Kollisionen und das ganze, nur das Prinzip)

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Jutschin ()