![]() |
MD5 + Salt (Shadow-File) aus Windows
Hallo zusammen,
da ich hier neu bin, hoffe ich mal, das ich die richtige Kategorie erwischt habe. Ich habe zwar schon die Suche durchwuehlt, konnte allerdings keine Antwort auf meine Frage finden. Kurz zu meinem Vorhaben: Ich moechte ein Shadow-File fuer Linux erstellen (/etc/shadow). Interessant ist hier allerdings nur der Hash des Passwortes. Das Passwort ist wie folgt aufgebaut: MD5-Hash mit Salt. (Was ich _nicht_ suche, ist das alte Crypt- Verfahren von Linux) Einen einen einfachen MD5-Hash zu erstellen ist kein Problem, dies mache ich mit MD5Print(MD5String('pass'). Einen salt zu erstellen, ist auch nicht das Problem (RandomBinary(8)). Nun zur eigentlichen Frage: Wie bekomme ich diese beiden "Werte" nun mit einander verknuepft, sodass das Passwort schlussendlich auch "gueltig" ist? Als Beispiel aus der /etc/shadow (Passwort ist 'password'): $1$7fX5iR5l$L8QJdkpAkAe6/ucGxAbBq. (Mit Linux-Befehl "passwd" erzeugt) Wenn ich die Lektueren richtig verstanden habe, ist der Salt "7fX5iR5l". Das $1$ ist der Hinweis fuer MD5-HMAC(?) - und das Zweite $ ist die Trennung von MD5-Hash zu Salt. Falls ich etwas durcheinander gebracht habe - bitte nicht schlagen ;) Hat schonmal jemand so eine Datei erstellt, oder kann mir einen Tip geben, wie ich die beiden Werte miteinander verknuepfe? (Sodass das Passwort ebenfalls gueltig ist) Besten Dank im Voraus Gr. Thomas |
Re: MD5 + Salt (Shadow-File) aus Windows
Zitat:
Delphi-Quellcode:
ist es jedenfalls nicht, Ergebnis wäre 'QyP1LFyqn4FKW2BonmXIIg=='. Die beiden '==' zeigen schon, daß nicht der ganze MD5-Fingerbdruck verwendet werden kann. Es könnte ein ziemlich kompliziertes Verfahren sein, wie es zB in salt:= Base64DecStr('7fX5iR5l'); MD5Init(Context); MD5Update(Context, @salt[1], length(salt)); MD5Update(Context, @password[1], sizeof(password)); MD5Final(Context,Digest); shadow := Base64Str(@digest, sizeof(Digest)); ![]() verwendet wird. Aber das ist dann nicht in 5 min nach Pascal umsetzbar. Gruß Gammatester |
Re: MD5 + Salt (Shadow-File) aus Windows
Hi Gammatester,
okay - ich hatte mir schon fast gedacht, das es so "einfach" nicht realisierbar ist. Nur durch die Suche und den staendig auftretenden Antworten zum Thema Hash/Crypt a la "Aber vergiss nicht, spaeter noch ein Salt zu verwenden" wurde ich wieder ein stueck optimistischer. Muss mir dann wohl eine alternative Moeglichkeit suchen, den Hash inkl. Salt zu generieren (Oder mich noch tiefer einlesen). Besten Dank fuer deine Muehe && Hilfe. Gr. Thomas |
Re: MD5 + Salt (Shadow-File) aus Windows
Hi,
jetzt muss ich doch nochmal fragen. Waere es denn ueber eine DLL realisierbar? Gibt es hier evtl. schon bekannte Implementation? (Das Hash-Verfahren ist ja nicht gerade unbekannt) Auch htpasswd (.htaccess-Dateien) kann dieses Hash- Verfahren nutzen (Wenn auch mit einer anderen Salt- Laenge) Ueber kleine Hinweise und Tips freue ich mich natuerlich auch :) Besten Dank Gr. Thomas |
Re: MD5 + Salt (Shadow-File) aus Windows
Bei SourceForge.net (ich glaub das war dort) gab's irgendwo ein Delphiprogramm zum erzeugen der .htaccess-Dateien
und IMHO mit QuellCode. |
Re: MD5 + Salt (Shadow-File) aus Windows
Zitat:
![]() bzw. im ![]() Ausgabe ist: Test:"L8QJdkpAkAe6/ucGxAbBq." Calc:"L8QJdkpAkAe6/ucGxAbBq." Schönes Wochenende Gammatester
Delphi-Quellcode:
program t_shad;
{$ifdef win32} {$apptype console} {$endif} uses mem_util, hash, md5; { Als Beispiel aus der /etc/shadow (Passwort ist 'password'): $1$7fX5iR5l$L8QJdkpAkAe6/ucGxAbBq. } function to64(l: longint; n: integer): string; const a64: array[0..63] of char = './0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'; var s: string; begin s := ''; while n>0 do begin s := s+a64[l and $3f]; l := l shr 6; dec(n); end; to64 := s; end; procedure md5crypt(const salt, pw: string; var shad: string); const magic: array[0..2] of char = '$1$'; var ctx,ctx1: THashContext; final: TMD5Digest; i: integer; l: longint; begin MD5Init(ctx); MD5Update(ctx, @pw[1], length(pw)); MD5Update(ctx, @magic, 3); MD5Update(ctx, @salt[1], length(salt)); MD5Init(ctx1); MD5Update(ctx1, @pw[1], length(pw)); MD5Update(ctx1, @salt[1], length(salt)); MD5Update(ctx1, @pw[1], length(pw)); MD5Final(ctx1, final); i := length(pw); while i>0 do begin if i>16 then MD5Update(ctx, @final, 16) else MD5Update(ctx, @final, i); dec(i,16); end; fillchar(final,sizeof(final),0); i := length(pw); while i<>0 do begin if odd(i) then MD5Update(ctx, @final, 1) else MD5Update(ctx, @pw[1], 1); i := i shr 1; end; MD5Final(ctx, final); for i:=0 to 999 do begin MD5Init(ctx1); if (i and 1) <>0 then MD5Update(ctx1, @pw[1], length(pw)) else MD5Update(ctx1, @final, 16); if i mod 3 <> 0 then MD5Update(ctx1, @salt[1], length(salt)); if i mod 7 <> 0 then MD5Update(ctx1, @pw[1], length(pw)); if (i and 1) <>0 then MD5Update(ctx1, @final, 16) else MD5Update(ctx1, @pw[1], length(pw)); MD5Final(ctx1, final); end; shad := ''; l := (longint(final[ 0]) shl 16) or (longint(final[ 6]) shl 8) or final[12]; shad := shad + to64(l,4); l := (longint(final[ 1]) shl 16) or (longint(final[ 7]) shl 8) or final[13]; shad := shad + to64(l,4); l := (longint(final[ 2]) shl 16) or (longint(final[ 8]) shl 8) or final[14]; shad := shad + to64(l,4); l := (longint(final[ 3]) shl 16) or (longint(final[ 9]) shl 8) or final[15]; shad := shad + to64(l,4); l := (longint(final[ 4]) shl 16) or (longint(final[10]) shl 8) or final[ 5]; shad := shad + to64(l,4); l := final[11]; shad := shad + to64(l,2); end; var shadow: string; begin md5crypt('7fX5iR5l', 'password', shadow); writeln('Test:"L8QJdkpAkAe6/ucGxAbBq."'); writeln('Calc:"',shadow,'"'); end. |
Re: MD5 + Salt (Shadow-File) aus Windows
Gammatester .. du bist einfach nur Klasse!
Vielen vielen Dank, ich hatte die Hoffnung auf Erfolg schon fast aufgegeben! Der Rest ist ja dann nurnoch ein klacks. :) PS: Auch ein Dank natuerlich an himitsu, ich werd bei Gelegenheit mal dort vorbeischauen und nach dem Projekt suchen. Gr. und ein naechstes schoenes Wochenende, wenn es denn dann kommt. Thomas |
Re: MD5 + Salt (Shadow-File) aus Windows
bitte auch wenn es nicht sofort hilfreich war (weiß halt den Namen nicht mehr ... ist aber auch schon ein/zwei Jahre her, wo ich das mal gesehn hatte ._. )
|
Re: MD5 + Salt (Shadow-File) aus Windows
Evtl. noch als kurzen Zusatz (Auch wenn es nicht wirklich oft benoetigt wird):
Wenn man sich nun noch den salt mit einer kleinen random-funktion generieren laesst (Sowohl bei htaccess, als auch bei shadow 8 Byte lang), braucht man schlussendlich nurnoch die einzelnen Teile zusammen zu fuegen, um ein gueltigen Hash zu speichern: Fuer Apache htaccess- Dateien (Mit Option "-m" fuer MD5 Encryption): '$apr1$'+salt+'$'+shadow oder fuer ein Linux- Passwort (/etc/shadow): '$1$'+salt+'$'+shadow So far, gr. T. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:22 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz