我的问题是,由于某种原因,他们似乎决定输入的数据采用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。
有没有一种方法可以使用ISO-8859-1字符串在Java中计算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”,因此两个调用将产生相同的结果。 - Alexander Pogrebnyak