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


Anmelden zum Antworten