Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   MD5 32 Bit und 64 Bit (https://www.delphipraxis.net/180834-md5-32-bit-und-64-bit.html)

Weeze14 22. Jun 2014 00:02

MD5 32 Bit und 64 Bit
 
Nur eine Verständnisfrage: ist ein MD5-Hash, der mit einer 32-Bit-Anwendung erzeugt wird derselbe wie der, der mit einer 64-Bit-Anwendung erzeugt wird?
Der Code, der für das Erstellen des Hash zuständig ist, ist in beiden Anwendungen identisch (Indy 10).

himitsu 22. Jun 2014 00:14

AW: MD5 32 Bit und 64 Bit
 
Gegenfragen:
Wozu ist ein Hash denn gut und wäre es nicht besser, wenn er überall gleich ist?

Gibt die Berenungsfunktion den selbern Wert raus, wenn man sie in C++, Delphi oder JavaScript schreibt?

Und wenn man in einer 64-Bit CPU mit 32-Bit-Intergern rechnet, kommt dann das selber raus, als wenn man das Selbe auf einer 32-Bit-CPU macht?

Weeze14 22. Jun 2014 00:20

AW: MD5 32 Bit und 64 Bit
 
Ok verstanden. Der Wert muss also identisch sein. Das dachte ich mir auch schon.
Ich fand es nur ein wenig seltsam, dass ein mit den Indy's (Version 10) berechneter MD5-Hash eines 32-Bit-Kompilats ungleich dem eines 64-Bit-Kompilats ist.

Sir Rufo 22. Jun 2014 00:25

AW: MD5 32 Bit und 64 Bit
 
Eine Hash-Funktion erstellt aus einer Menge an Bytes einen Hashwert .
Bei identischen Mengen (Länge/Inhalt) muss immer der identische Hashwert erstellt werden.

Wenn das nicht gegeben ist, dann ist entweder die Hash-Funktion falsch implementiert oder die Eingangsdaten sind eben nicht identisch (sehr beliebt wenn ein Hash von einem String erzeugt werden soll und mal wieder nicht auf das Encoding geachtet wurde)

Weeze14 22. Jun 2014 00:35

AW: MD5 32 Bit und 64 Bit
 
Hier kann nicht viel schieflaufen denke ich:
Delphi-Quellcode:
uses
  SysUtils, IdHashMessageDigest, IdHash;

function MD5String(const Input: String): String;
var
 MD5: TIdHashMessageDigest5;
begin
 MD5 := TIdHashMessageDigest5.Create;
 Result := Trim(LowerCase(MD5.HashStringAsHex(Input)));
 MD5.Free;
end;

himitsu 22. Jun 2014 00:38

AW: MD5 32 Bit und 64 Bit
 
Zitat:

Zitat von Weeze14 (Beitrag 1263155)
Hier kann nicht viel schieflaufen denke ich:

Zitat:

Zitat von Sir Rufo (Beitrag 1263154)
(sehr beliebt wenn ein Hash von einem String erzeugt werden soll und mal wieder nicht auf das Encoding geachtet wurde)

:zwinker:

Weeze14 22. Jun 2014 00:40

AW: MD5 32 Bit und 64 Bit
 
Mhh.. ich dachte der holt sich die Kodierung automatisch - falsch gedacht.
Füge ich nun aber TEncoding.ANSI als kodierung hinzu, ist der Hash mit 32-Bit korrekt, nicht aber mit 64-Bit :roll:

himitsu 22. Jun 2014 02:00

AW: MD5 32 Bit und 64 Bit
 
Zitat:

Zitat von Weeze14 (Beitrag 1263157)
Mhh.. ich dachte der holt sich die Kodierung automatisch - falsch gedacht.

Aus dem hier sichtbaren Code ist das nicht erkenntlich :zwinker: und reingesehn hatte ich aber auch nicht. :stupid:
Es kommt drauf an, was die innen machen, aber da der String früher einfach als "ANSI" gehasht wurde, kann es jetzt zu Problemen kommen, denn die können ja nicht blind das Unicode (seit Delphi 2009) in ANSI umwandeln.

Viele Codes kodieren das sorgar dann einfach als Unicode (also ganz einfach unverändert den binären Inhalt und manchmal sogar wird auch noch nur die Hälfte gehascht, da man gerne mal das SizeOf(Char)=2 vergessen hat.

Und selbst ANSI war früher schonmal falsch, denn wenn ein Russe, Japaner und selbst ein Ami seinen ANSI-String hashen tat, dann kam dennoch schnell mal etwas Anderes raus, als wenn das ein Deutscher machte.

Zitat:

Zitat von Weeze14 (Beitrag 1263157)
nicht aber mit 64-Bit :roll:

Hmmmm, also entweder machst du immernoch einen Fehler, oder
Zitat:

Zitat von Sir Rufo (Beitrag 1263154)
Wenn das nicht gegeben ist, dann ist entweder die Hash-Funktion falsch implementiert oder die Eingangsdaten sind eben nicht identisch


Weeze14 22. Jun 2014 02:39

AW: MD5 32 Bit und 64 Bit
 
Die Eingabedaten sind nur ein Teststring (const s: String = 'Test'; ) und der ist immer gleich.
Sehr misteriös denke ich.

Demnach ist diese Funktion also sehr schlecht nehme ich an. Denn Angenommen ich übergebe "Tèst", dann ist das Ergebnis wieder falsch, da man den Encoding ja angeben muss.
Gibt es denn sinnvolle Alternativen?


Edit:
bisher habe ich zum Vergleichen den hash-Generator http://hashgenerator.de benutzt. Leider muss ich sagen, dass der schlecht ist und daher die falschen Werte kommen.

Ich übergebe der MD5-Funktion jetzt auch als Encoding das "TEncoding.Default". Ist das ok so oder nicht?

Der Wert der 64-Bit-Version ist aber noch immer ungleich der 32-Bit-Version.

Sir Rufo 22. Jun 2014 07:34

AW: MD5 32 Bit und 64 Bit
 
Ich denke ich war noch nicht deutlich genug:

Um wirklich die Funktion eines Hash-Generators zu prüfen muss ich dem Hash-Generator gesichert identische Daten übergeben.

Und was verarbeitet so eine Hash-Funktion? Richtig, Byte-Mengen.

Also gibt man so einem Hash-Generator eine definierte Byte-Menge um die Ergebnisse zu überprüfen.

Und wie wird ein String dann gehasht? Der wird vorher in eine Byte-Menge umgewandelt.
(Sollte ich dieses umgewandelt irgendwie noch größer oder bunter oder irgendwie lauter schreiben?)

Eignet sich ein String jetzt für so eine Überprüfung? Nein, denn nun ist ja nicht nur der Hash-Generator involviert, sondern auch die Umwandlung von String in eine Byte-Menge!

Für eine sinnvolle Überprüfung der Hash-Funktion führt man auf den unterschiedlichen Systemen einen Test mit identischen Byte-Mengen durch.
Für eine sinnvolle Überprüfung der String in Byte-Menge führt man auf den unterschiedlichen Systemen einen Test mit identischen Strings durch - und wundert sich ;)


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:55 Uhr.
Seite 1 von 2  1 2      

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 by Thomas Breitkreuz