Passwort-Speicherung unter Linux

Hallo,

ich beschäftige mich gerade mit dem Format der Speicherung der Passwörter unter Linux und komme irgendwie nicht weiter:

die Passwörter werden nicht in der passwd sondern aus Sicherheitsgründen in der shadow gespeichert - habe ich verstanden

dort habe ich username:blush:x$y$z: etc. - wobei x der Hashalgorithmus ($1 für MD5), y das Salt und z der Hash von Salt und Passwort ist - verstanden

Salt und Hash werden nicht im Klartext, sondern base64-codiert gespeichert - nicht ganz verstanden

MD5-Hashes sollten doch Hexadezimal-Format haben - wenn ich aber meinen Hash base64-decodiere bekomme ich nur nur wirres Zeug

Beispiel:

Passwort: „frankfurt“
Random Salt: „jdWhvBjd“
Ergebnis: „$1$jdWhvBjd$.3TX7.jgXI0f5pYYZJUVp.“

wenn ich jetzt aber „.3TX7.jgXI0f5pYYZJUVp.“ base64-decodiere komme ich auf „Ý5ûŽÈÑþia†I“ und das ist ja beim besten Willen nicht hexadezimal…

MD5-Hash von „jdWhvBjdfrankfurt“ wäre doch „1fae5a9225be5d3207786599d2694d80“

könnt ihr mir da weiterhelfen: wo liegt mein Verständnisfehler?

Danke

Martin

Salt und Hash werden nicht im Klartext, sondern base64-codiert
gespeichert

Bist Du sicher?

MD5-Hashes sollten doch Hexadezimal-Format haben - wenn ich
aber meinen Hash base64-decodiere bekomme ich nur nur wirres
Zeug

Na was denn sonst? :wink:

MD5-Hash von „jdWhvBjdfrankfurt“ wäre doch
„1fae5a9225be5d3207786599d2694d80“

http://en.wikipedia.org/wiki/Crypt_%28Unix%29
First the passphrase and salt are hashed together, yielding an MD5 message digest. Then a new digest is constructed, hashing together the passphrase, the salt, and the first digest, all in a rather complex form. Then this digest is passed through a thousand iterations of a function which rehashes it together with the passphrase and salt in a manner that varies between rounds. The output of the last of these rounds is the resulting passphrase hash.

The fixed iteration count has caused this scheme to lose the computational expense that it once enjoyed. Variable numbers of rounds are now favoured.

könnt ihr mir da weiterhelfen: wo liegt mein
Verständnisfehler?

Du denkst, es würde nur 1x gehasht - wird’s aber nicht.

MD5-Hashes sollten doch Hexadezimal-Format haben - wenn ich
aber meinen Hash base64-decodiere bekomme ich nur nur wirres
Zeug

wenn ich jetzt aber „.3TX7.jgXI0f5pYYZJUVp.“ base64-decodiere
komme ich auf „Ý5ûŽÈÑþia†I“ und das ist ja beim besten Willen
nicht hexadezimal…

MD5-Hash von „jdWhvBjdfrankfurt“ wäre doch
„1fae5a9225be5d3207786599d2694d80“

könnt ihr mir da weiterhelfen: wo liegt mein
Verständnisfehler?

Danke

Martin

Hallo

Ich bin zwar jetzt kein Verschlüsselungsspezialist, aber ich hab es prinzipiell so verstanden:

Das von dir Beschriebene ist genau das, was auch bezweckt ist, soll heißen, es SOLL so sein, dass man aus dem Hash eben nicht das Passwort zurückrechnen kann, deswegen speichert man ja einen Hash, und verwendet dafür Algorithmen, die eben gerade nicht (zumindest nicht eindeutig) reversibel sind, denn so kann der der den Hash kennt, von da nicht auf das Klartext-Passwort schliessen.

Für die Verifizierung eines eingegebenen Passwortes reicht es völlig, dessen Hash nach dem vorgeschriebenen Algorithmus nochmals zu berechnen, und dann mit dem gespeicherten Hash zu vergleichen.
Das erhöht die Sicherheit des Passwortes ungemein.

Bei der Übertragung von Hashes über z.B. das Internet ist damit die Sicherheit natürlich nicht vollkommen, wenn man den Hashwert kennt, und nochmals überträgt, könnte man auch ohne Kenntnis des Original-PW Zugriff erlangen (replay-Attacke z.B.).
Deswegen plädieren viele Experten dafür, solche Angaben(auch einen PW-Hash) immer verschlüsselt zu übertagen (im Sinne von Verschlüsselung der gesamten Datenübertragung, also z.B. der IP-Pakete, worin Login-Daten übertragen werden), deswegen findet man öfters für Logins die Option „Login mit https“ o.ä.

Hoofe ich hab das jetzt verstänlich rübergebracht.

Gruß Uwe

Salt und Hash werden nicht im Klartext, sondern base64-codiert
gespeichert - nicht ganz verstanden

MD5-Hashes sollten doch Hexadezimal-Format haben - wenn ich
aber meinen Hash base64-decodiere bekomme ich nur nur wirres
Zeug

Ich weiß jetzt nicht wie es wirklich gemacht wird, aber wieso sollte man einen MD5-Hash im Hexadezimal-String-Format das ja ohnehin nur ASCII enthält mit Base64 kodieren? Base64 nutzt man ja, um binäre Informationen in ASCII zu kodieren. Daher würde das nur Sinn machen, wenn der MD5-Hash eben als Binärzahl gespeichert wird und dann ist es auch nicht verwunderlich, wenn nach dem Umwandeln via Base64 nur noch „Müll“ rauskommt.

Das von dir Beschriebene ist genau das, was auch bezweckt ist,
soll heißen, es SOLL so sein, dass man aus dem Hash eben nicht
das Passwort zurückrechnen kann, deswegen speichert man ja
einen Hash, und verwendet dafür Algorithmen, die eben gerade
nicht (zumindest nicht eindeutig) reversibel sind, denn so
kann der der den Hash kennt, von da nicht auf das
Klartext-Passwort schliessen.

Gott, daran hab ich nicht gedacht - ich hatte verstanden, der OP wollte nur die Hash-Werte vergleichen…
Nochmal in aller Deutlichkeit: Hash-Funktionen sind Einbahnstraßen-funktionen, es ist nicht möglich aus nem Hash den Ausgangswert zu berechnen. Wer sich einarbeiten möchte liest weiter zu Details wie Kollisionen und Rainbow-Tables…

Hallo marktwain,

Salt und Hash werden nicht im Klartext, sondern base64-codiert
gespeichert

Bist Du sicher?

es ist jedenfalls kein „Klartext“-MD5 Hash mehr und im Internet habe ich an verschiedenen Stellen gefunden, es sei base64 (im Prinzip aber inverses base64, weil das ja eigentlich aus 8bit in 6bit konvertiert)

MD5-Hashes sollten doch Hexadezimal-Format haben - wenn ich
aber meinen Hash base64-decodiere bekomme ich nur nur wirres
Zeug

Na was denn sonst? :wink:

naja noch vieeel wirrer als erwartet halt

The output of the last of these rounds is the
resulting passphrase hash.

The fixed iteration count has caused this scheme to lose the
computational expense that it once enjoyed. Variable numbers
of rounds are now favoured.

könnt ihr mir da weiterhelfen: wo liegt mein
Verständnisfehler?

Du denkst, es würde nur 1x gehasht - wird’s aber nicht.

hmm - ok, aber woher weiss ich wie oft ich hashen muss?

ich hashe einmal, Ergebnis stimmt nicht überein, hashe nochmal etc. ?

das könnte ja ewig weitergehen bis ich (evtl.zufällig) zum gleichen Hash komme (auch wenn Kolissionen nicht ganz so häufig sind)

trotzdem sollte bei bloßem MD5-hashen, wie oft auch immer, doch ein hexadezimaler Wert rauskommen

und den Transfer von diesem zum in /etc/shadow gespeicherten schaffe ich nicht :frowning:

trotzdem vielen Dank

Gruß

Martin

Hallo Uwe,

Hoofe ich hab das jetzt verstänlich rübergebracht.

hast du, vielen Dank

dass man einen Hash-Algorithmus nicht rückwärts anwenden kann sondern auf Kollisionen hofft war mir schon so etwa klar (Gegenmaßnahme: Rainbowtables, Gegenmaßnahme: Salts)

aber warum in der /etc/shadow nicht direkt der MD5-Hash (der es ja letztendlich ist, sagt zumindest das $1 am Anfang) steht sondern etwas anderes und wie ich dorthin komme (oder von dort wieder zum Hash) - das habe ich nicht verstanden oder kann es zumindest nicht nachvollziehen, mit base64 wie vermutet ging es eben nicht :frowning:

Gruß

Martin

Hallo Deconstruct,

Ich weiß jetzt nicht wie es wirklich gemacht wird, aber wieso
sollte man einen MD5-Hash im Hexadezimal-String-Format das ja
ohnehin nur ASCII enthält mit Base64 kodieren? Base64 nutzt
man ja, um binäre Informationen in ASCII zu kodieren.

stimmt, da hast du Recht

ich bin jetzt davon ausgegangen, dass es „inverses“ base64 ist, habe das aber so nicht geschrieben (und es war ja auch nur ne Vermutung)

jedenfalls wird jedoch wenn ich base64 darauf anwende nicht wie vermutet etwas im Hexadezimal-Format draus - und das war mein Problem

gibt es vielleicht sowas wie eine „offizielle“ Anleitung zu dem Passwortverwaltungsmechanismus in der ich sowas nachlesen kann?

ich habe zwar im Internet danach gesucht, jedoch nur entweder keine genaueren Informationen oder in einigen Fällen den Hinweis mit base64 gefunden - und ein RFC in dem jedoch nur die Anwendung von MD5 selbst beschrieben war

Gruß

Martin

1 Like

OT Hash

könnt ihr mir da weiterhelfen: wo liegt mein
Verständnisfehler?

Du denkst, es würde nur 1x gehasht - wird’s aber nicht.

Sehr richtig, einmal soll oft gar nicht den Effekt erzielen, die meisten Hasher machen´s 2-3 mal.
Und hören danach auch nicht sofort wieder auf.
Viele treiben es sogar irgendwann soweit, dass sie speeden oder sogar basen, was kurzfristig zwar die Rechenleistung erhöht, aber zu manchmal irreparablen Schäden an Festplatte oder Zentralrecheneinheit führen kann.
:wink:

hmm - ok, aber woher weiss ich wie oft ich hashen muss?

(irony)Am besten ganz die Finger vom Hash, und den Umgang damit den dafür zuständigen Institutionen überlassen.

ich hashe einmal, Ergebnis stimmt nicht überein, hashe nochmal
etc. ?

Nein bloß nicht!!

das könnte ja ewig weitergehen bis ich (evtl.zufällig) zum
gleichen Hash komme (auch wenn Kolissionen nicht ganz so
häufig sind)

Ja könnte, aber am Ende steht sowas wie Nina Hagen, und so willst du doch nicht werden, oder? Und Kollisionen beim Hashen kommen nicht so selten vor, wie du vielleicht denkst.(/irony)
Im Ernst, es geht ja nicht nur um mehrfache Hashes, sondern die werden nach Verknüpfung mit neuem Salt und letztem Ergebnis nochmals gehasht, wenn die beschreibene crypt-Funktion angewandt wird.
Letztendlich ist das bestimmt irgendwo beim Linux-Standard oder bei der Distro definiert.

trotzdem sollte bei bloßem MD5-hashen, wie oft auch immer,
doch ein hexadezimaler Wert rauskommen

Kann ja sein, vielleicht ist der Wert, den du findest, hexadezimal, aber nicht im hexadezimalen Format dargestellt? Oder nicht Big-Endian sondern Little-Endian oder umgekehrt?

und den Transfer von diesem zum in /etc/shadow gespeicherten
schaffe ich nicht :frowning:

Da würde ich wirklich mal auf einem Forum deiner Distribution nachfragen, oder vielleicht mal bei sourceforge.net oder ähnlichen Spezialisten-Seite.
Oben hatte dir jemand einen Link zur crypt-Funktion gegeben, wenn diese bei den Shadow-PW verwendet werden, kannst du es ja vielleicht nachvollziehen, wenn du es genau wissen willst, wie es geht, solltest du vielleicht in der Doc zu deiner Distribution nachschauen, irgendwo muß sich da ja was finden lassen.

Ich versteh nur nicht, wozu die Mühe, willst du einen eigenen PW-Algorithmus entwickeln?

trotzdem vielen Dank

Gruß

Martin

Lebe lang und mögest du immer genug Kaffee haben!
Uwe

Ich versteh nur nicht, wozu die Mühe, willst du einen eigenen
PW-Algorithmus entwickeln?

Genau das ist auch mein Problem. Du willst entweder was hacken (versuch’s ruhig), oder das Rad neu erfinden (mir genau so recht).
Erklär doch mal was Du erreichen möchtest - manchmal führen viele Wege zum Ziel!

Lebe lang und mögest du immer genug Kaffee haben!

Und immer ein Handtuch mitnehmen!

OK, wieder ernst: Lies Dir mal die crypt Funktion aus der glibc durch, die Sourcen findest Du schon…

aber warum in der /etc/shadow nicht direkt der MD5-Hash (der
es ja letztendlich ist, sagt zumindest das $1 am Anfang)

Nein, das sagt es nicht. Du machst einen Denkfehler, das sagt nur, das die crypt() Funktion MD5 benutzt hat. Es wird aber nicht einfach nur 1x gehasht, sondern viele viele Male.

steht
sondern etwas anderes und wie ich dorthin komme (oder von dort
wieder zum Hash)

Das ist der Hash von nem Hash von nem Hash usw - Du musst die crypt() Funktion verstehen, ich werde nicht müde es zu sagen: Use the source, Luke!

Nachdem ich mich selber ein wenig eingelesen habe bin ich sicher, das base64 damit überhaupt garnix zu tun hat.

Nochmal: crypt() aus der glibc ist was Du verstehen mußt. Obwohl ich raten würde, das es andere Möglichkeiten gibt das zu erreichen was Du vermutlich tun willst.

1 Like

Hallo zusammen,

sorry dass ich mich so lange nicht mehr gemeldet habe, habe aber momentan beruflich zu viel zu tun

ja, ich möchte versuchen etwas zu Brute-Forcen, da ich mit einem Wörterbuch nicht weiter komme

nein, es ist nichts illegales (ok, das sagen sie alle) - der Rechner ist eh mir

statt auf meine GPU zu vertrauen möchte ich lieber eines der vielen Programme zum finden von MD5-Kollisionen per GPU benutzen

dir crypt-Funktion werde ich mir sobald ich wieder etwas freie Zeit habe mal genauer ansehen

vielen Dank euch allen

Gruß

Martin