Vil*_*nen 3 java md5 utf-8 iso-8859-1
我正在实施名为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();
Run Code Online (Sandbox Code Playgroud)
不幸的是,两个散列都与值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"));
Run Code Online (Sandbox Code Playgroud)
您似乎误解了字符串编码的工作原理,并且您的Crypt类的API是可疑的.
字符串实际上并没有"编码" - 编码就是用来在字符串和字节之间进行转换的.
Java字符串在内部存储为UTF-16,但这并不重要,因为MD5适用于字节,而不是字符串.你的Crypt.md5sum()方法必须首先将它传递给字符串的字符串转换为字节 - 它使用什么编码来做到这一点?这可能是你问题的根源.
您的示例代码非常荒谬,因为此行具有唯一的效果:
String prehashIso = new String(prehash.getBytes("ISO-8859-1"), "ISO-8859-1");
Run Code Online (Sandbox Code Playgroud)
是用问号替换ISO-8859-1中无法表示的字符.