Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi MD5 + Salt (Shadow-File) aus Windows (https://www.delphipraxis.net/106326-md5-salt-shadow-file-aus-windows.html)

aayb 9. Jan 2008 09:00


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

gammatester 9. Jan 2008 13:46

Re: MD5 + Salt (Shadow-File) aus Windows
 
Zitat:

Zitat von aayb
Hallo zusammen,

[schipp]

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)

Ein einfaches Salt-Dekodieren und dann wieder Zusammenbastelm wie zB so

Delphi-Quellcode:
 
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));
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 http://doxygen.postgresql.org/crypt-md5_8c-source.html
verwendet wird. Aber das ist dann nicht in 5 min nach Pascal umsetzbar.

Gruß Gammatester

aayb 9. Jan 2008 14:10

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

aayb 11. Jan 2008 09:07

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

himitsu 11. Jan 2008 10:38

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.

gammatester 11. Jan 2008 12:37

Re: MD5 + Salt (Shadow-File) aus Windows
 
Zitat:

Zitat von aayb
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

Hier ist ein Code, der zumindest Dein Beispielshadow erzeugt. Units gibts auf http://home.netsurf.de/wolfgang.ehrh...rchash_de.html
bzw. im zip

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.

aayb 17. Jan 2008 12:12

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

himitsu 17. Jan 2008 13:30

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 ._. )

aayb 17. Jan 2008 17:27

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 12:09 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz