MD5-Hash bei Java und C# geben nicht das selbe Ergebnis?
Hallo zusammen,
ich versuche in den letzten Tage mich mit der Entwickleroberfläche der FritzBox auseinander zu setzen. Leider scheitete ich am Session ID Login.
Der Login funktioniert über eine Challenge (String) den mir die FritzBox generiert und dem Passwort der FritzBox. Wenn ich den Login richtig verstanden habe geht er wie folgt:
Schritt 1: Challenge erhalten via fritz.box/login_sid.lua
Schritt 2: Alle Zeichen im Passwort der FritzBox, welche nicht in ISO-8859-1
anzeigbar sind (einen CodePoint von über 255 besitzen) mit einem "."
ersetzen
Schritt 3: Einen MD5-Hash im Format von 32 Hexzeichen mit Kleinbuchstaben
generieren aus dem String %Challenge%-%Passwort% (%Challenge% ist die
aus dem Schritt 1, %Passwort% ist das Passwort der FritzBox aus dem
Schritt 2)
Schritt 4: Das Ergebnis zum Anmelden nutzen:
http://fritz.box/login_sid.lua?response=%Challenge%-%Ergebnis%
(%Ergebnis% ist der
MD5-Hash aus Schritt 3)
So: Was ist nun mein Problem?
Ich möchte diesen MD5-Hash generieren. Ich habe mir bereits Tutorials angeschaut, wie die von baeldung.com und auch einen String als Ergebnis bekommen. Das Problem ist aber, dass der Hash falsch ist.
Also habe ich mir den Beispiel C#-Code auf der FritzBox Webseite angeschaut und ausprobiert. Das Ergebnis ist ein ganz anderer Hash. Wie kommt das zu Stande?
Damit man mich besser versteht, habe ich hier meinen Java Code und den Code aus C#.
Input bei allen:
51cbb71a-Test
Java (Möglichkeit 1): https://pastebin.com/vpzA8mr9 (um Platz zu sparen als Link)
Output:
DigestTest: 3e2a82112b721922d21a2e62e12f02212b02142c12692a82
Java (Möglichkeit 2):
StringBuilder builder = new StringBuilder();
for (byte b : DigestUtils.md5(input)) {
builder.append(byteToHex(b));
}
System.out.println("BuilderDigest: " + builder.toString());
Output:
BuilderDigest: 3ea811b7192d1ae6e1f021b014c169a8
Java (Möglichkeit 3):
String md5Hex = DigestUtils.md5Hex(input); //API: commons-codec-1.15.jar
System.out.println("Hash: " + md5Hex);
Output:
Hash: 3ea811b7192d1ae6e1f021b014c169a8
C#
static void Main(string[] args) {
try {
MD5 md5Hasher = MD5.Create();
byte[] encoded = Encoding.Unicode.GetBytes("51cbb71a-Test");
byte[] data = md5Hasher.ComputeHash(encoded);
StringBuilder builder = new StringBuilder();
for (int i = 0; i < data.Length; i++) {
builder.Append(data[i].ToString("x2"));
}
Console.WriteLine(builder.ToString());
} catch(IndexOutOfRangeException exception) {
Console.WriteLine("null");
}
}
Output:
0e9af10abdb7cd7119a85967272e3bc3
Wieso kommt da was anderes raus und wie kann ich das nun auch in Java umsetzen? (Der C#-Code gibt die richtige Lösung!)
Danke schon einmal im Voraus!
Links die Helfen können:
- https://avm.de/fileadmin/user_upload/Global/Service/Schnittstellen/Session-ID_deutsch_13Nov18.pdf
- https://www.baeldung.com/java-md5 (etwas alt)
- https://www.youtube.com/watch?v=hW2s03abGaI
- https://codedocu.de/...