输出SHA 1校验和使用java与给定的示例不匹配

时间:2012-11-28 04:44:02

标签: java cryptography sha1

我正在编写一个代码来使用java生成SHA-1校验和。我提到了这个链接http://code.wikia.com/wiki/SHA_checksum。我的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

任何人都可以提供有关上述内容的见解。

1 个答案:

答案 0 :(得分:1)

这是包含引用文档有用的情况。示例出现,它可能来自此文档:http://www.securepay.com.au/uploads/Integration%20Guides/SecureFrame_Integration_Guide.pdf

该文件第3.3.5节“交易金额”规定金额字段必须为“货币基本单位”。所以你的字符串上的1.00需要是美分,而不是美元。

如果您将1.00更改为100,您将获得该文档所需的SHA-1总和。

但是,这不是您报告的总和。

重新检查您的文档并验证您是否错过了对基础数据的转换。