MD5哈希具有不同的结果

时间:2011-07-27 05:57:00

标签: hash md5

我试图将一些链编码到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 个答案:

答案 0 :(得分:19)

我猜的问题是在不同的文本编码中。您显示的字符串不能用ANSI编码表示 - 它需要UTF-16或UTF-8。后者之一的选择导致字符串的不同字节表示并产生不同的哈希值。

请记住,MD5散列字节,而不是字符 - 在将字节输入MD5之前,如何将这些字符编码为字节取决于您。如果要与其他系统进行互操作,则必须使用与这些系统相同的编码。

答案 1 :(得分:8)

让我们用Python来理解这一点。

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

在上面的输出中,我们看到'ç'和'ñ'的UTF-8编码。

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

因此,当我们计算UTF-8编码数据的MD5哈希时,我们得到第一个结果。

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

在这里,我们看到'ç'和'ñ'的Unicode代码点。

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

因此,当我们计算用字符串中每个字符的Unicode代码点(可能是ISO-8859-1编码)表示的数据的MD5哈希时,我们得到第二个结果。

因此,第一个网站正在计算UTF-8编码数据的散列,而第二个网站则没有。

答案 2 :(得分:4)

如果我尝试:

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 :(得分:3)

我猜想其中一些网站没有正确处理非ascii字符。如果您使用的是标准md5库,那么只要您和所连接的系统就您使用的字符编码达成一致就应该没问题。

顺便说一下,不建议再使用MD5。如果这是为了加密目的,那么你应该真正转向SHA2。

相关问题