Deus Figendi: Verschlüsselung von Passwörtern

Beitrag lesen

Habe folgenden Funktionsaufruf gefunden:
hash('sha512',$salt . $message);

Unten schrieb Encoder dass du das Salz auch in die Datenbank schreiben kannst, eigentlich solltest du das sogar tun, weil der Sicherheitseffekt sonst nur marginal ist.

Diese Art des "salt" dient dazu Angriffe mit Regenbogentabellen zu erschweren. Regenbogentabellen sind Tabellen in denen bereits viele Hashes vorberechnet sind und die man entsprechend durchsuchen kann.

Nun das Szenario:
Der Angriff gegen den du dich mit Passwort-Hashing schützt ist ja, dass deine Datenbank verloren gehen könnte.
Also angenommen deine DB gerät in falsche Hände, die PWs hast du nicht verschlüsselt. Das ist schlecht der Angreifer hat sofort alle Passwörter.
Also hast du deine PWs vorher gehashed...
Der Angreife bekommt also alle PW-Hashes und dursucht seine Regenbogentabelle nach den Hashes, die du in deiner DB hast. Typischerweise haben manche User natürlich "god" oder "password" oder "123456" oder "dfghjkl" verwendet, die werden leicht gefunden, weil sie natürlich in jeder RT drin stehen.
Genau das wollen wir erschweren und fügen ein fest codiertes Salz dem Passwort hinzu. Sagen wir dein Salz ist "1".
Jetzt braucht der Angreifer eine umfangreiche Regenbogentabelle, denn die üblichen PWs (Wörterbuchangriff) funktionieren nicht mehr. Aber auf der umfangreichen Tabelle findet er "password1" und er errät, dein Salz, besorgt sich die passende Tabelle für PWs, die auf 1 enden (1234561 god1 etc...) und knackt wieder Unmengen von PWs.
Um dieses Szenario zu erschweren erstellst du für jedes einzelne PW eigenes, zufälliges Salz und speicherst es im Klartext direkt neben das gehashte Passwort.
Klingt ein bisschen absurd, denn der Angreifer hat ja die DatenBank und kann das Salz mit abgreifen. Aber der Angriff mit dünnen Regenbogentabellen funktioniert nicht mehr. Der Angreifer muss zunächst eine Tabelle verwenden, in denen "alle" (alle geht nicht) Hashes stehen, die irgendeines deiner Salze enthalten. Mal angenommen er knackt damit eines der Konten, dann hilft ihm das gar nichts, außer dass er dieses eine Salt aus seiner Tabelle rausschmeißen kann, er ist keinen Schritt weiter und muss weiter auf einer gigantischen Tabelle suchen, die eben hoffentlich nicht ausgerechnet die Kombinationen PW+Salt enthält.

Wie du das Salz erzeugst ist bei der ganzen Sache fast egal (es sollte sich nicht [oft] wiederholen), im Grunde sind sogar vorhersehbare Methoden relativ unkritisch also z.B.
hash('sha512',md5($benutzername) . $passwort);
Den Wert musst du nämlich nicht extra in die DB speichern :D (ist dafür öffentlich) Der Angreifer kann also theoretisch vor seinem Angriff schon Regenbogentabellen erstellen, aber ob er das vorher oder nachher macht... pffft Hauptsache sie wird unökonomisch groß.

--
sh:( fo:| ch:? rl:( br:& n4:& ie:{ mo:} va:) de:µ_de:] zu:) fl:( ss:| ls:[ js:(