Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi MD5 Hash Verständnis Problem (https://www.delphipraxis.net/102505-md5-hash-verstaendnis-problem.html)

Astartes 30. Okt 2007 08:12


MD5 Hash Verständnis Problem
 
Liste der Anhänge anzeigen (Anzahl: 2)
Hi,

Ich bräuchte mal Hilfe zum Thema MD5 Verschlüsselung!

1. Warum sind die Ergebnisse unterschiedlich bei dem folgenden Code ? (Siehe projekt.exe)
2. Warum ändert sich der Hashwert bei 3 nicht, wenn ich lNew noch vor der Label1.Caption Zuweisung setze ?
3. Warum ändert sich der Hashwert bei 3, wenn ich lNew vor der Label3.Caption Zuweisung setze ?

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
  var
  lNew,lNew2       : String;
begin
{
    Function MD5Hash(APWD: String): String;
    Begin
      With THash_MD5.Create Do
      Try
        Init;
        Calc(APwd, Length(APwd));
        Done;

        Result := DigestStr(TFormat_HEX);
      Finally
        Free;
      End;
    End;
 }

  lNew := Edit1.Text;

  {1}Label1 .Caption := ' = ' + MD5_HASH.MD5Hash(Edit1.Text);
  {2}Label2 .Caption := ' = ' + MD5_HASH.MD5Hash('ms');


  // lNew := Edit1.Text; setze ich lNew hier kommt auch immer ein anderer Hashwert raus bei 3
  {3}Label3 .Caption := ' = ' + MD5_HASH.MD5Hash(lNew);
  {4}Label4 .Caption := ' = ' + MD5_HASH.MD5Hash(PChar('ms'));
  {5}Label9 .Caption := ' = ' + MD5_HASH.MD5Hash(PChar(Edit1.Text));


  {6}lNew2 := Edit1.Text;
  Label13.Caption := ' = ' + MD5_HASH.MD5Hash(lNew2);


  {7}lNew2 := PChar('ms');
  Label11.Caption := ' = ' + MD5_HASH.MD5Hash(lNew2);

end;
Nachträglich eingefügt: Wenn ich von MD5 Verschlüsselung spreche meine ich MD5 Hash!

Mit freundlichen Grüßen Tom

[edit=Phoenix]Titel auf Anfrage des Autors geändert. Mfg, Phoenix[/edit]

mkinzler 30. Okt 2007 08:19

Re: MD5 Verschlüsselung Verstandnis Problem
 
MD5 ist keine Verschlüsselung sondern ein Hash-Verfahren
Und dein Programm konnte ich nicht starten, weil es eine FastMM-Dll anmahnt.

Phoenix 30. Okt 2007 08:20

Re: MD5 Verschlüsselung Verstandnis Problem
 
Zitat:

Zitat von Fehlermeldung
Die Anwendung konnte nicht gestartet werden, weil FastMM_FullDebugMode.dll nicht gefunden wurde...


Astartes 30. Okt 2007 08:31

Re: MD5 Verschlüsselung Verstandnis Problem
 
Das mit der Verschlüsselung ist ein Tippfehler ! Und ich hoffe die EXE funktioniert jetzt Sorry hat ich nicht getestet ! :-D

negaH 31. Okt 2007 02:45

Re: MD5 Hash Verständnis Problem
 
Zitat:

Delphi-Quellcode:
 
 Function MD5Hash(APWD: String): String;
    Begin
      With THash_MD5.Create Do
      Try
        Init;
        Calc(APwd, Length(APwd));
        Done;

        Result := DigestStr(TFormat_HEX);
      Finally
        Free;
      End;
    End;

Entweder bseitigst du den Fehler aus obigem Source oder benutzt gleich

Delphi-Quellcode:
Result := THash_MD5.CalcBinary(APWD, TFOrmat_HEX);
Der Fehler im obigen source ist

Delphi-Quellcode:
Calc(APwd[1], Length(APwd));

// oder

Calc(PChar(APwnd)^, Length(APwnd)); // TypCast LongString nach PChar mit anschließnder Dereferenzierung des zeigers
APwd -> Type LongString und damit ein Pointer auf eine interne PLongStringRec Datenstruktur und nicht dem eigentlichen String.

MD5 als Hash funktion kann in sogenannten MDC -> Message Digest Cipher auch als Verschlüsselung benutzt werden, auch wenn ich das persönlich für ein schlechtes Vorgehen erachte. Man kann also mit MD5 auch Daten verschlüsseln, damit ist dieses Verfahren dann auch eine Verschlüsselungsfunktion.


Ach und nochwas. Deine Art ein Passwort in einen Sessionkey umzuwandlen bzw. es zu schützen ist unsicher. Es lassen sich auf diese Weise zb. Brute Force Angriffe per Rainbow Tabellen anwenden. Besser ist es so

Delphi-Quellcode:
function HashPassword(const Password: String; const HashClass: TDECHashClass = THash_MD5): String;
var
  Salt: Binary;
begin
  Salt := RandomBinary(16);
  Result := TFormat_HEX.Encode(Salt) + ValidHash(HashClass).KDFx(Password, Salt, 16, TFormat_HEX);
end;
Wir erzeugen einen Zufallswert, 16 Bytes lang, und hashen diesen per KDF -> Key Derivation Function -> Schlüsselableitungfunktion auf sichere Weise. So entsteht ein 32 Bytes langer Wert der in den ersten 16 Bytes den Salt speichert und in den zweiten 16 bytes den Output der KDF zum Salt + Password.
Wollte man nun per Rainbow Tabellen auf ein so umgewandeltes Passwort eine Brute Force Attacke durchführen, also ein Wörterbuch benutzen, so benötigte man bei 16 Bytes langen Keys nicht mehr nur 2^128 Einträge pro Dictionary sondern 2^128 * 2^128. Also für jedes einzelne Password müsste man eine eigene Rainbow Tabelle erzeugen.

Gruß Hagen

Astartes 31. Okt 2007 10:46

Re: MD5 Hash Verständnis Problem
 
@negaH Danke für die Erklärung!

Mit freundlichen Gruß Tom

Muetze1 31. Okt 2007 13:48

Re: MD5 Hash Verständnis Problem
 
Na toll. Ich ging bisher immer davon aus, dass Calc() einen String als ersten Parameter hat und nicht einen unspezifischen Daten-Pointer. :wall: Nicht denken, wissen Muetze1!

@Astartes: War der Code nicht von einem Beispiel? Woher kam die Routine?

Astartes 31. Okt 2007 15:34

Re: MD5 Hash Verständnis Problem
 
Ja, der Code stammte aus dem Delphipraxisforum. hier

Sehe grad das ich beim Abschreiben einen Fehler gemacht habe ! :wall:

Mit freundlichen Gruß Tom


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:34 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