我正在实现一个名为Suomen Verkkomaksut的数字支付服务接口。有关付款的信息通过HTML表单发送给他们。为了确保在传输过程中没有人混淆了信息,MD5哈希计算两端的特殊密钥并未发送给它们。MD5哈希的ISO-8859-1字符串在Java中
我的问题是,由于某些原因,他们似乎认为传入的数据是用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|[email protected]|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。
有没有一种方法可以用ISO-8859-1字符串在Java中计算MD5哈希值?
更新:在等待Suomen Verkkomaksut的答案时,我找到了一种替代方法来制作哈希。 Michael Borgwardt纠正了我对String和编码的理解,并且寻找了一种从byte []中进行散列的方法。
Apache Commons是库的一个很好的来源,我发现他们的DigestUtils类有一个md5hex函数,它需要byte []输入并返回一个32个字符的十六进制字符串。
由于某些原因,这仍然不起作用。这两个返回相同的值:
DigestUtils.md5Hex(prehash.getBytes());
DigestUtils.md5Hex(prehash.getBytes("ISO-8859-1"));
如果您想获得可预测的结果,请不要使用第一种形式的'getBytes()'。它使用系统的默认编码。您来自芬兰,您的默认编码很可能是'ISO-8859-1',因此这两个调用都会产生相同的结果。 – 2009-12-03 14:04:13