我正在實現一個名爲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