在使用各种语言的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校验和失败的代码中出现间歇性错误,我怀疑这是原因 - 但由于它是间歇性的,很难说是否更改此修复它。)
谢谢!
答案 0 :(得分:1)
是的,您必须明确,因为MD5校验和超过了一系列BYTES,而不是字符。因此,您需要可预测的字符转换为字节。
答案 1 :(得分:0)
是的,最好在两端散列相同的编码。在编码之前将Python字符串解码为unicode。