Frank Benkstein said:
ich habe eine Frage an die Kryptographie-Experten:
Ist es möglich, ein Passwort, das mit einem einfachen
# echo -n "geheim" | md5sum e8636ea013e682faf61f56ce1cb1ab5c -
==hex(md5(passwd))
gehasht wurde, in die Form
# pwcrypt -m -s salt geheim $1$salt$3Q0Ci6p8QjNcX/f6P6IFa/
=="$1$"+salt+"$"+base64(md5(salt+passwd))
zu bringen oder umgekehrt?
Nein. MD5 ist ein "Falltueralgorithmus", sprich: was da drin ist kommt nicht mehr raus. MD5 mit und ohne salt bringt also sehr unterschiedliche Ergebnisse (im Durchschnitt sollte sich die Haelfte der Bits unterscheiden).
...es sei denn Du findest einen Algorithmus, der MD5 knacken kann (Kollisionswahrscheinlichkeit 1:2**64, gilt als einigermassen sicher). Aber dann ist er auch nicht mehr fuer Passworte geeignet.
...bei genauerem Ueberlegen: crypt(2) ist eigentlich auch nicht mehr fuer Passworte geeignet.
Aber so etwas aehnliches wie echo -n "saltgeheim" | md5sum sollte wandelbar sein, indem man hex nach base64 konvertiert. Aber wozu die Muehe, wenn es schon ein Tool dazu gibt?
Ich hab schon versucht, __md5_crypt_r in der glibc zu verstehen, aber so richtig schlau geworden bin ich nicht. Mag auch daran liegen, dass ich (noch) nicht weiß, wie md5 genau geht.
Kann ich verstehen.... ;-)
Ich ignoriere normalerweise die Mathematik und konzentriere mich auf das Interface bei solchen Algorithmen, aber dazu muss man erstmal wissen, wo welches von beiden aufhoert. Tipp: schau Dir die Sourcen von libgcrypt an, das Interface ist bei den Algos (cipher/*) immer ganz unten, die Mathematik sind die ellenlangen Formeln darueber (bei MD5&Co. die Funktion transform). Also von unten nach oben lesen...
Vom Konzept ist MD5 (genau wie MD4, SHA*, RIPE-MD*) recht einfach aufgebaut:
Man zerstueckele den Input in Bloecke (MD5: 16 Byte) und jage jeden dieser Bloecke durch die Transformation. In der T. werden die Bits des aktuell gespeicherten MD-Zwischenergebnis und des Input miteinander verknuepft, wobei man heutzutage mehrere Runden von Operationen nimmt, die die Bits gruendlich durchschuetteln (sorry, liebe Mathematiker...). Die letzten Bytes Input werden noch mit vordefinierten Werten aufgefuellt und dann ebenfalls "geschuettelt", das Ergebnis dieser letzten Transformation ist der Message Digest.
Das "Durchschuetteln" ist selbstverfreilich eine recht komplizierte Wissenschaft fuer sich, von der selbst die meisten normalsterblichen Mathematiker einen respektvollen Abstand halten (nicht weil es keiner begreift, sondern weil man sich da trefflich blamieren kann, wenn man einen kleinen Fehler macht).
Konrad