加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

MD5在Java中使用ISO-8859-1字符串哈希

发布时间:2020-12-15 05:15:53 所属栏目:Java 来源:网络整理
导读:我正在实施一个名为 Suomen Verkkomaksut的数字支付服务界面.有关付款的信息将通过HTML表格发送给他们.为了确保在传输过程中没有人对信息感到困惑,MD5哈希在两端用一个未发送给他们的特殊密钥计算. 我的问题是,由于某种原因,他们似乎决定传入的数据是用ISO-8
我正在实施一个名为 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字符串做了一些按摩,或者你忽略了.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读