21 Stimmen

MD5-Hash mit unterschiedlichen Ergebnissen

Ich versuche, einige Ketten in MD5 zu kodieren, aber ich habe das bemerkt:

Für die Kette: "123456çñ"

Einige Webseiten wie

http://www.md5.net

www.md5.cz

md5generator.net

zurück: "66f561bb6b68372213dd9768e55e1002"

Und andere wie:

http://www.adamek.biz/md5-generator.php

7thspace.com/webmaster_tools/online_md5_encoder.html

md5.rednoize.com/

zurück: "9e6c9a1eeb5e00fbf4a2cd6519e0cfcb"

Ich müsste die Ketten mit standard md5 verschlüsseln, weil ich meine Ergebnisse mit anderen Systemen verbinden muss. welcher Hash ist der richtige?

Vielen Dank im Voraus

4 Stimmen

Irgendetwas sagt mir, dass es ein Kodierungsproblem ist...

25voto

sharptooth Punkte 162790

Das Problem liegt wohl in den unterschiedlichen Textkodierungen. Die von Ihnen gezeigte Zeichenfolge kann nicht in ANSI-Kodierung dargestellt werden - sie erfordert UTF-16 oder UTF-8. Die Wahl einer der letzteren führt zu einer anderen Byte-Darstellung der Zeichenfolge, was unterschiedliche Hashes ergibt.

Denken Sie daran, dass MD5 Bytes und keine Zeichen verschlüsselt - es liegt an Ihnen, wie Sie diese Zeichen als Bytes kodieren, bevor Sie die Bytes an MD5 weitergeben. Wenn Sie mit anderen Systemen interagieren wollen, müssen Sie die gleiche Kodierung wie diese Systeme verwenden.

6 Stimmen

Ooo, du hast mich um 25 Sekunden geschlagen :) Das wird mich lehren, Zeit mit der Empfehlung von SHA2 zu verschwenden.

8voto

Susam Pal Punkte 29750

Um dies zu verstehen, wollen wir Python verwenden.

>>> '123456çñ'
'123456\xc3\xa7\xc3\xb1'
>>> 'ç'
'\xc3\xa7'
>>> 'ñ'
'\xc3\xb1'

In der obigen Ausgabe sehen wir die UTF-8-Kodierung von "ç" und "ñ".

>>> md5('123456çñ').digest().encode('hex')
'66f561bb6b68372213dd9768e55e1002'

Wenn wir also den MD5-Hash der UTF-8-kodierten Daten berechnen, erhalten wir das erste Ergebnis.

>>> u'ç'
u'\xe7'
>>> u'ñ'
u'\xf1'

Hier sehen wir die Unicode-Codepunkte 'ç' und 'ñ'.

>>> md5('123456\xe7\xf1').digest().encode('hex')
'9e6c9a1eeb5e00fbf4a2cd6519e0cfcb'

Wenn wir also einen MD5-Hash der Daten berechnen, die mit den Unicode-Codepunkten der einzelnen Zeichen in der Zeichenkette dargestellt werden (möglicherweise ISO-8859-1 kodiert), erhalten wir das zweite Ergebnis.

Die erste Website berechnet also den Hash der UTF-8-kodierten Daten, während die zweite dies nicht tut.

6voto

Enki Punkte 563

Wenn ich es versuche:

echo "123456çñ<br />";
echo "utf-8 : ".md5("123456çñ")."<br />";
echo "ISO-8859-1 : ".md5(iconv("UTF-8", "ISO-8859-1","123456çñ"))."<br />";

Es ergibt sich das Ergebnis :

123456çñ
utf-8 : 66f561bb6b68372213dd9768e55e1002
ISO-8859-1 : 9e6c9a1eeb5e00fbf4a2cd6519e0cfcb

Die erste Website kodiert die Zeichenfolge in ISO-8859-1 und die zweite in UTF-8.

3voto

Cameron Skinner Punkte 48467

Ich würde vermuten, dass einige dieser Websites nicht korrekt mit Nicht-ASCI-Zeichen umgehen. Wenn Sie eine standardmäßige md5-Bibliothek verwenden, sollte alles in Ordnung sein, solange Sie und das System, mit dem Sie sich verbinden, sich über die verwendete Zeichenkodierung einig sind.

Übrigens wird die Verwendung von MD5 nicht mehr empfohlen. Wenn dies für Kryptozwecke geschieht, sollten Sie wirklich auf SHA2 umsteigen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X