Hash 具有不同结果的MD5哈希

Hash 具有不同结果的MD5哈希,hash,md5,Hash,Md5,我试图将一些链编码到MD5,但我注意到: 链:“123456çñ” 有些网站像 www.md5.cz md5generator.net 返回:“66f561bb6b68372213dd9768e55e1002” 还有一些人喜欢: 7thspace.com/webmaster_tools/online_md5_encoder.html md5.rednoize.com/ 返回:“9e6c9a1eeb5e00fbf4a2cd6519e0cfcb” 我需要用standar md5对链进行编码,因为

我试图将一些链编码到MD5,但我注意到:

链:“123456çñ”

有些网站像

www.md5.cz

md5generator.net

返回:“66f561bb6b68372213dd9768e55e1002”

还有一些人喜欢:

7thspace.com/webmaster_tools/online_md5_encoder.html

md5.rednoize.com/

返回:“9e6c9a1eeb5e00fbf4a2cd6519e0cfcb”

我需要用standar md5对链进行编码,因为我需要将结果与其他系统连接起来。哪个哈希是正确的


提前感谢

我想问题在于不同的文本编码。您显示的字符串不能用ANSI编码表示-它需要UTF-16或UTF-8。选择后者之一会导致字符串的不同字节表示形式,并产生不同的散列


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

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


顺便说一下,MD5不再推荐使用。如果这是出于加密目的,那么您真的应该转向SHA2。

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

>>> '123456çñ'
'123456\xc3\xa7\xc3\xb1'
>>> 'ç'
'\xc3\xa7'
>>> 'ñ'
'\xc3\xb1'
在上面的输出中,我们看到了“ç”和“ñ”的UTF-8编码

>>> md5('123456çñ').digest().encode('hex')
'66f561bb6b68372213dd9768e55e1002'
>>> md5('123456\xe7\xf1').digest().encode('hex')
'9e6c9a1eeb5e00fbf4a2cd6519e0cfcb'
因此,当我们计算UTF-8编码数据的MD5散列时,我们得到第一个结果

>>> u'ç'
u'\xe7'
>>> u'ñ'
u'\xf1'
在这里,我们可以看到Unicode代码点'ç'和'ñ'

>>> md5('123456çñ').digest().encode('hex')
'66f561bb6b68372213dd9768e55e1002'
>>> md5('123456\xe7\xf1').digest().encode('hex')
'9e6c9a1eeb5e00fbf4a2cd6519e0cfcb'
因此,当我们计算字符串中每个字符(可能是ISO-8859-1编码的)的Unicode代码点表示的数据的MD5哈希时,我们得到第二个结果

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

如果我尝试:

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

第一个网站用ISO-8859-1对字符串进行编码,第二个网站用UTF-8进行编码。

有人告诉我这是一个编码问题……哦,比我快25秒:)这会教我浪费时间推荐SHA2。