2012-11-28 29 views
0

我正在编写使用java生成SHA-1校验和的代码。我提到这个链接http://code.wikia.com/wiki/SHA_checksum。我的Java代码是如下:SHA 1的输出使用java与给定示例不匹配的校验和

import java.security.MessageDigest; 
import java.security.NoSuchAlgorithmException; 

public class SHAHashing{ 

    public static void main(String[] args)throws Exception{ 
      String password = "ABC0010|txnpassword|0|Test Reference|1.00|20110616221931"; 
      MessageDigest md = MessageDigest.getInstance("SHA-1"); 
      md.update(password.getBytes("UTF-8")); 
      System.out.println("Converting SHA digest output to Hex String : "+byteArrayToHexString(SHAsum(password.getBytes("UTF-8")))); 
      System.out.println("Converting md.digest output to Hex String : "+byteArrayToHexString(md.digest())); 
    } 

    public static byte[] SHAsum(byte[] convertme) { 
     MessageDigest md = null; 
     try { 
      md = MessageDigest.getInstance("SHA-1"); 
     } catch (NoSuchAlgorithmException e) { 
      e.printStackTrace(); 
     } 
     return md.digest(convertme); 
    } 

    public static String byteArrayToHexString(byte[] b) { 
     String result = ""; 
     for (int i=0; i < b.length; i++) { 
      result += Integer.toString((b[i] & 0xff) + 0x100, 16).substring(1); 
     } 
     return result; 
    } 
} 

的上述的输出是:

转换SHA摘要输出到十六进制字符串:7871d5c9a366339da848fc64cb32f6a9ad8fcadd
md.digest输出转换为十六进制字符串:7871d5c9a366339da848fc64cb32f6a9ad8fcadd

我有一个输入字符串:"ABC0010|txnpassword|0|Test Reference|1.00|20110616221931" 其对应的输出是:01a1edbb159aa01b99740508d79620251c2f871d根据文档我正在使用它来生成指纹。

任何人都可以提供对上述请求的见解。

+0

您应该将字节数组转换为十六进制字符串。请参阅http://stackoverflow.com/a/4895572/130224 – reprogrammer

+0

嗨重编程器,根据您的指示我修改了我的代码如下。但它仍然没有达到预期的产出。请使用测试字符串来产生结果。 –

+0

当它们都调用相同的方法时,md.digest()如何产生与方法SHAsum()不同的结果? –

回答

1

这是一个有助于包含参考文档的例子。示例出现它可能来自此文档:http://www.securepay.com.au/uploads/Integration%20Guides/SecureFrame_Integration_Guide.pdf

该文档“交易金额”的第3.3.5节指定金额字段必须位于“货币的基本单位”。因此,您的字符串上的1.00需要以美分为单位,而不是美元。

如果您将1.00更改为100,您将得到文档预期的SHA-1总和。

但是,这不是您报告的金额。

重新检查您的文档,并验证您是否错过了底层数据的转换。

+0

感谢您的回复Devon_C_Miller,使用您提供的文档,我能够生成与文档中相同的输出。我实际上是为指纹生成这个。示例:设置指纹 用|连接的字段分离器: ABC0010 | txnpassword | 0 |测试参考| 1.00 | 20110616221931 SHA1上面的字符串:01a1edbb159aa01b99740508d79620251c2f871d