MD5 хэш с разными результатами

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

Для цепи: "123456" -

Некоторые веб-страницы, например

http://www.md5.net

www.md5.cz

md5generator.net

return: "66f561bb6b68372213dd9768e55e1002"

И другим нравится:

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

7thspace.com/webmaster_tools/online_md5_encoder.html

md5.rednoize.com/

return: "9e6c9a1eeb5e00fbf4a2cd6519e0cfcb"

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

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

Ответы

Ответ 1

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

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

Ответ 2

Давайте использовать 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, а второй - нет.

Ответ 3

Если я попробую:

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.

Ответ 4

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

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