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.