【发布时间】:2009-12-03 10:21:31
【问题描述】:
我正在实现一个名为Suomen Verkkomaksut 的数字支付服务接口。有关付款的信息通过 HTML 表单发送给他们。为了确保在传输过程中没有人弄乱信息,在两端计算 MD5 哈希,并使用不发送给它们的特殊密钥。
我的问题是,出于某种原因,他们似乎认为传入的数据是使用 ISO-8859-1 而不是 UTF-8 编码的。我发送给他们的哈希是使用 UTF-8 字符串计算的,因此它与他们计算的哈希不同。
我用下面的代码试过这个:
String prehash = "6pKF4jkv97zmqBJ3ZL8gUw5DfT2NMQ|13466|123456||Testitilaus|EUR|http://www.esimerkki.fi/success|http://www.esimerkki.fi/cancel|http://www.esimerkki.fi/notify|5.1|fi_FI|0412345678|0412345678|esimerkki@esimerkki.fi|Matti|Meikäläinen||Testikatu 1|40500|Jyväskylä|FI|1|2|Tuote #101|101|1|10.00|22.00|0|1|Tuote #202|202|2|8.50|22.00|0|1";
String prehashIso = new String(prehash.getBytes("ISO-8859-1"), "ISO-8859-1");
String hash = Crypt.md5sum(prehash).toUpperCase();
String hashIso = Crypt.md5sum(prehashIso).toUpperCase();
不幸的是,两个哈希值都与值 C83CF67455AF10913D54252737F30E21 相同。根据 Suomen Verkkomaksut 的文档,此示例的正确值为 975816A41B9EB79B18B3B4526569640E。
有没有办法在 Java 中使用 ISO-8859-1 字符串计算 MD5 哈希?
更新:在等待 Suomen Verkkomaksut 的答复时,我找到了另一种制作哈希的方法。 Michael Borgwardt 纠正了我对字符串和编码的理解,我寻找一种方法从 byte[] 生成哈希。
Apache Commons 是一个很好的库来源,我发现他们的 DigestUtils 类有一个 md5hex 函数,它接受 byte[] 输入并返回一个 32 个字符的十六进制字符串。
由于某种原因,这仍然不起作用。这两个都返回相同的值:
DigestUtils.md5Hex(prehash.getBytes());
DigestUtils.md5Hex(prehash.getBytes("ISO-8859-1"));
【问题讨论】:
-
如果您想获得可预测的结果,切勿使用
getBytes()的第一种形式。它使用系统的默认编码。您来自芬兰,您的默认编码很可能是“ISO-8859-1”,因此两次调用都会产生相同的结果。
标签: java utf-8 md5 iso-8859-1