MD5 хеш с разными результатами - PullRequest
16 голосов
/ 27 июля 2011

Я пытаюсь закодировать некоторые цепочки в MD5, но я заметил, что:

Для цепочки: "123456çñ"

Некоторые сети, такие как

http://www.md5.net

www.md5.cz

md5generator.net

возврат: "66f561bb6b68372213dd9768e55e1002"

И другие, как:

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

7thspace.com / webmaster_tools / online_md5_encoder.html

md5.rednoize.com /

возврат: "9e6c9a1eeb5e00fbf4a2cd6519e0cfcb"

Мне нужно кодировать цепочки стандартным md5, потому что мне нужно связать свои результаты с другими системами. какой хэш правильный?

Заранее спасибо

Ответы [ 4 ]

21 голосов
/ 27 июля 2011

Проблема, я думаю, заключается в различных текстовых кодировках.Показываемая строка не может быть представлена ​​в кодировке ANSI - для нее требуется UTF-16 или UTF-8.Выбор одного из последних приводит к разному байтовому представлению строки и приводит к разным хэшам.

Помните, MD5 хэширует байты, а не символы - вам решать, как кодировать эти символы как байты перед передачей байтовдо MD5.Если вы хотите взаимодействовать с другими системами, вы должны использовать ту же кодировку, что и эти системы.

8 голосов
/ 27 июля 2011

Давайте используем Python, чтобы понять это.

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

В приведенном выше выводе мы видим кодировку UTF-8 'ç' и 'ñ'.

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

Итак, когда мы вычисляем MD5-хэш данных в кодировке UTF-8, мы получаем первый результат.

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

Здесь мы видим кодовые точки Unicode 'ç' и 'ñ'.

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

Итак, когда мы вычисляем MD5-хэш данных, представленных с помощью кодовых точек Unicode каждого символа в строке (возможно, в кодировке ISO-8859-1), мы получаем второй результат.

Таким образом, первый веб-сайт вычисляет хэш данных в кодировке UTF-8, а второй - нет.

4 голосов
/ 27 июля 2011

Если я попытаюсь:

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

Это дает результат:

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

Первый сайт кодирует строку в ISO-8859-1, а второй - в UTF-8.

3 голосов
/ 27 июля 2011

Я полагаю, что некоторые из этих сайтов неправильно обрабатывают символы, отличные от ascii. Если вы используете стандартную библиотеку md5, то с вами должно быть все в порядке, если вы и система, к которой вы подключаетесь, договорились о том, какую кодировку символов вы используете.

Кстати, MD5 больше не рекомендуется для использования. Если это для криптографических целей, то вы действительно должны перейти на SHA2.

...