我试图将一些链编码到MD5,但我注意到:
链条:"123456çñ"
有些网络喜欢
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对链进行编码,因为我需要将结果与其他系统连接起来.哪个哈希是正确的?
提前致谢
sha*_*oth 21
我想问题是在不同的文本编码.您显示的字符串不能用ANSI编码表示 - 它需要UTF-16或UTF-8.后者之一的选择导致字符串的不同字节表示并产生不同的散列.
请记住,MD5哈希字节,而不是字符 - 在将字节提供给MD5之前,如何将这些字符编码为字节取决于您.如果要与其他系统进行互操作,则必须使用与这些系统相同的编码.
让我们用Python来理解这一点.
>>> '123456çñ'
'123456\xc3\xa7\xc3\xb1'
>>> 'ç'
'\xc3\xa7'
>>> 'ñ'
'\xc3\xb1'
Run Code Online (Sandbox Code Playgroud)
在上面的输出中,我们看到'ç'和'ñ'的UTF-8编码.
>>> md5('123456çñ').digest().encode('hex')
'66f561bb6b68372213dd9768e55e1002'
Run Code Online (Sandbox Code Playgroud)
因此,当我们计算UTF-8编码数据的MD5哈希时,我们得到第一个结果.
>>> u'ç'
u'\xe7'
>>> u'ñ'
u'\xf1'
Run Code Online (Sandbox Code Playgroud)
在这里,我们看到'ç'和'ñ'的Unicode代码点.
>>> md5('123456\xe7\xf1').digest().encode('hex')
'9e6c9a1eeb5e00fbf4a2cd6519e0cfcb'
Run Code Online (Sandbox Code Playgroud)
因此,当我们计算用字符串中每个字符的Unicode代码点(可能是ISO-8859-1编码)表示的数据的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 />";
Run Code Online (Sandbox Code Playgroud)
它给出了结果:
123456çñ
utf-8 : 66f561bb6b68372213dd9768e55e1002
ISO-8859-1 : 9e6c9a1eeb5e00fbf4a2cd6519e0cfcb
Run Code Online (Sandbox Code Playgroud)
第一个网站以 ISO-8859-1 编码字符串,第二个以 UTF-8 编码。