【问题标题】:Character encoding issues when generating MD5 hash cross-platform跨平台生成 MD5 哈希时的字符编码问题
【发布时间】:2024-01-09 21:56:02
【问题描述】:

这是在使用各种语言的 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 校验和失败的间歇性错误,我怀疑这就是原因 - 但由于它是间歇性的,很难说更改它是否可以解决问题。)

谢谢!

【问题讨论】:

    标签: encoding utf-8 md5 set character


    【解决方案1】:

    是的,您必须明确,因为 MD5 校验和是在一个字节序列上,而不是字符。因此,您需要将字符可预测地转换为字节。

    【讨论】:

      【解决方案2】:

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

      【讨论】: