2010-03-25 83 views
1

这是关于在各种语言中使用MD5库时字符编码的一般问题。我担心的是:假设我生成使用原生Python字符串对象的MD5哈希值,像这样:生成MD5散列跨平台时的字符编码问题

message = "hello world" 
m = md5() 
m.update(message) 

然后我采取的MD5哈希的十六进制版本使用:

m.hexdigest() 

和发送邮件& MD5散列通过网络,比方说,一个JMS消息或HTTP请求。

现在我在Java程序中以本地Java字符串的形式获取此消息以及校验和。然后,我生成使用Java的MD5哈希值,像这样(使用共享编解码器库):

String md5 = org.apache.commons.codec.digest.DigestUtils.DigestUtils.md5Hex(s) 

我的感觉是,这是错误的,因为我还没有在任何一端指定的字符encodng。所以原始的散列将基于Python版本的字符串的字节; Java中的一个将基于Java版本字符串的字节,这两个字节序列通常不会相同 - 是吗?所以我真的需要指定“UTF-8”或任何两端的权利?

(我实际上得到在我的代码,其中的MD5校验失败的间歇性的错误,我怀疑这是什么原因 - 但因为它是间歇性的,这是很难说,如果改变这种修复与否)

谢谢!

回答

1

是的,您必须是显式的,因为MD5校验和位于BYTES序列之上,而不是字符。因此,您需要将字符预测转换为字节。

0

是的,最好在两端散列相同的编码。在编码之前将Python字符串解码为一个unicode。