Unterschiedliche MD5 Implementierungen liefern unterschiedlichen Hash-Wert?
-
Hi,
ja also die Frage steht im Prinzip schon im Topic. Das kann doch eigentlich nicht sein oder? Also konkret habe ich folgenden Fall:
In einem C#-Programm wird ein MD5-Hash von einem Passwort erzeugt und in eine Datenbank geschrieben (es wird hier die MD5CryptoServiceProvider-Klasse benutzt).
Diesen Hash-Wert lese ich später wieder von einem C++ Programm aus und will den mit anderen MD5-Hashes vergleichen. Ich habe mir jetzt schon 2 MD5-Implementierungen in C++ besorgt (eine ist z.B. von Codeproject), aber die liefern auf demselben Passwort einen anderen Hashwert wie den Hash von C#. (Allerdings sind die erzeugten Hash-Werte der C++-Implementierungen untereinander gleich).Im C#-Projekt wird beim Erzeugen des Hashes ein Byte-Arrray zurückgeliefert, und dann wird jedes Byte nacheinander mit ToString("x2") (was wohl eine Hex-Repräsentation erzeugt) zu einem String zusammengesetzt, der dann eben in der DB gespeichert wird. In meinen C++ Implementierungen wird dies allerdings automatisch intern schon erledigt, d.h. dort wird auch eine Hexadezimal-Repräsentation erzeugt und diese dann als String zurückgeliefert.
-
Klingt nach einem Problem mit der Eingabe.
Erzeugst du vielleicht in C# einen Hash von einem Unicode-String und in C++ von einem String mit 8-Bit Zeichen ?
Dann kriegst du natürlich einen anderen Hashwert.
-
kannst ja damit vergleichen: http://md5-hash-online.waraxe.us/
-
Hmm ja, also daran mit den Kodierungen dachte ich auch zuerst. Ich hab dann einfach mal in dem C#-Code alle möglichen Kodierungen (die man da auswählen kann) ausprobiert (ASCII,UTF8,UTF32,Unicode), aber habe immer einen anderen Hash als den der C++ Implementierungen erhalten. Deshalb hatte ich das eigentlich ausgeschlossen.
Jetzt hab ich allerdings mal folgendes ausprobiert: Bisher war ja normal immer Unicode aktiviert in meinem C++ Projekt (Win32,MFC). Jetzt hab ich das mal deaktiviert (und dann sollte CString ja auch nur normale chars benutzen, also ANSI), und schwupps kam genau der selbe Hash wie bei dem C# Projekt raus.
Das wundert mich aber etwas, da das ja eigentlich auch mit Unicode funktionieren sollte...vielleicht liegts auch an der C++ Implementierung... muss ich mal schauen
-
Du musst darauf achten, das immer die gleichen "Bytes" gehasht werden, sonst kommt natürlich ein anderer Hash raus (was ja auch so sein soll ;)). Also muss das Encoding auf beiden Systemen gleich sein. Wenn du also C++ immer mit Unicode kompiliert hast, musst du das bei C# auch so machen (Ich glaub unter Windos ist Unicode => UTF-16)
-
Ja, also ich hatte natürlich dann mit Unicode in C++ auch die Unicode-Codierung in C# benutzt. Aber das hatte eben seltsamerweise nicht funktioniert. Zumindest nicht mit der Implementierung die ich getestet hatte. Aber die ist glaub auch fehlerhaft, denn jetzt mit der anderen funktioniert das