MD5在Java中使用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(); 不幸的是,两个散列都与值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")); 解决方法
Java有一个标准的java.security.MessageDigest类,用于计算不同的哈希值.
这是示例代码 include java.security.MessageDigest; // Exception handling not shown String prehash = ... final byte[] prehashBytes= prehash.getBytes( "iso-8859-1" ); System.out.println( prehash.length( ) ); System.out.println( prehashBytes.length ); final MessageDigest digester = MessageDigest.getInstance( "MD5" ); digester.update( prehashBytes ); final byte[] digest = digester.digest( ); final StringBuffer hexString = new StringBuffer(); for ( final byte b : digest ) { final int intByte = 0xFF & b; if ( intByte < 10 ) { hexString.append( "0" ); } hexString.append( Integer.toHexString( intByte ) ); } System.out.println( hexString.toString( ).toUpperCase( ) ); 不幸的是,它产生相同的“C83CF67455AF10913D54252737F30E21”哈希值.所以,我想你的Crypto类是免责的.我特意添加了prehash和prehashBytes长度打印输出以验证确实使用了’ISO-8859-1′.在这种情况下,两者都是328. 当我做了presash.getBytes(“utf-8”)时,它产生了“9CC2E0D1D41E67BE9C2AB4AABDB6FD3”(并且字节数组的长度变为332).再次,不是您正在寻找的结果. 所以,我猜Suomen Verkkomaksut对一些他们没有记录的prehash字符串做了一些按摩,或者你忽略了. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |