生成MD5哈希跨平台时的字符编码问题

时间:2010-03-25 21:20:11

标签: encoding utf-8 md5 set character

在使用各种语言的MD5库时,这是关于字符编码的一般问题。我担心的是:假设我使用本机Python字符串对象生成MD5哈希,如下所示:

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

然后我使用:

获取该MD5哈希的十六进制版本
m.hexdigest()

并发送消息&通过网络进行MD5哈希,比方说,JMS消息或HTTP请求。

现在我在Java程序中以本机Java字符串的形式获得此消息以及校验和。然后我使用Java生成MD5哈希,就像这样(使用Commons Codec库):

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

我的感觉是这是错误的,因为我没有在任何一端指定字符编码。所以原始哈希将基于字符串的Python版本的字节; Java将基于字符串的Java版本的字节,这两个字节序列往往不一样 - 是吗?所以我真的需要在两端指定“UTF-8”或其他什么吗?

(我实际上在MD5校验和失败的代码中出现间歇性错误,我怀疑这是原因 - 但由于它是间歇性的,很难说是否更改此修复它。)

谢谢!

2 个答案:

答案 0 :(得分:1)

是的,您必须明确,因为MD5校验和超过了一系列BYTES,而不是字符。因此,您需要可预测的字符转换为字节。

答案 1 :(得分:0)

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