私はSuomenVerkkomaksutと呼ばれるデジタル決済サービスのインターフェースを実装しています。支払いに関する情報は、HTMLフォームを介して送信されます。転送中に誰も情報を台無しにしないようにするために、MD5ハッシュは、送信されない特別なキーを使用して両端で計算されます。
私の問題は、何らかの理由で、着信データがUTF-8ではなくISO-8859-1でエンコードされていると判断したように見えることです。私が彼らに送ったハッシュは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と同じです。この例の場合の正しい値は、SuomenVerkkomaksutのドキュメントによると975816A41B9EB79B18B3B4526569640Eです。
ISO-8859-1文字列を使用してJavaでMD5ハッシュを計算する方法はありますか?
更新: Suomen Verkkomaksutからの回答を待っている間に、ハッシュを作成する別の方法を見つけました。Michael Borgwardtは、文字列とエンコーディングの理解を修正し、byte[]からハッシュを作成する方法を探しました。
Apache Commonsはライブラリの優れたソースであり、byte[]入力を受け取って32文字の16進文字列を返すmd5hex関数を持つDigestUtilsクラスを見つけました。
何らかの理由で、これはまだ機能しません。これらは両方とも同じ値を返します。
DigestUtils.md5Hex(prehash.getBytes());
DigestUtils.md5Hex(prehash.getBytes("ISO-8859-1"));