使用HmacSHA256进行哈希处理会返回意外结果

时间:2018-11-13 06:42:40

标签: java hash cryptography sha256 hmac

我需要使用SHA-256算法与MAC签署消息。我有用于生成MAC的代码,但是另一端的验证失败。 有人告诉我我要计算的值是错误的。

这是我的代码

    public static byte[] calculateMAC(byte[] _aiOutBufferForMacCalculation, String key) {
    try{

        Mac sha256_HMAC = Mac.getInstance("HmacSHA256");
        SecretKeySpec secret_key = new SecretKeySpec(key.getBytes(), "HmacSHA256");
        sha256_HMAC.init(secret_key);
        byte[] mac_data=sha256_HMAC.doFinal(_aiOutBufferForMacCalculation);

        String result = "";
        for (final byte element : mac_data)
        {
            result += Integer.toString((element & 0xff) + 0x100, 16).substring(1);
        }
        System.out.println("Result:[" + result + "]");

        return mac_data;
    } catch (Exception _exception) {
        _exception.printStackTrace();
    }

    public static byte[] hexStringToByteArray(String s) {
    int len = s.length();
    byte[] data = new byte[len / 2];
    for (int i = 0; i < len; i += 2) {
        data[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4)
                             + Character.digit(s.charAt(i+1), 16));
    }
    return data;
}

   public static void main(String[] args) {
    String key = "7F6D7A688019DC4CA83883F2459E6B389BE99BB63B622A97";
    String cadena = "1800990000014303181112190600048430303030303134370029030003483032001148324830303030303135320008143919751D5EB97C";


    byte[] data_for_mac = hexStringToByteArray(cadena);

    System.out.println(new String(data_for_mac));

    byte[]mac =  calculateMAC(data_for_mac,key);



}

}

我看到的结果是: 0e01a8a96b30ae0a918865d1cef898ea4f96e18680fa9aae4c5d9902090c2f81

但是期望值是: 7684024da7fe89029965ac037a1ec94b21479c91cd8495e726fec924e84b0773

我使用了两个在线工具,这些工具允许我输入十六进制字符串作为inputo来生成哈希。结果与预期相同,因此我确认我的问题。

我不知道自己在做什么或做错什么,任何人都可以帮忙吗? 谢谢

1 个答案:

答案 0 :(得分:0)

从您的main函数参数中,我还期望该键也是十六进制字符串。因此,您也需要为此呼叫hexStringToByteArraygetBytes()方法仅返回字节,不会从十六进制字符串转换。

calculateMAC函数更改为以下内容:

public static byte[] calculateMAC(byte[] _aiOutBufferForMacCalculation, byte[] key) {
    try{

        Mac sha256_HMAC = Mac.getInstance("HmacSHA256");
        SecretKeySpec secret_key = new SecretKeySpec(key, "HmacSHA256");
    ...
    }

main像这样:

public static void main(String[] args) {
    String key = "7F6D7A688019DC4CA83883F2459E6B389BE99BB63B622A97";
    String cadena = "1800990000014303181112190600048430303030303134370029030003483032001148324830303030303135320008143919751D5EB97C";


    byte[] data_for_mac = hexStringToByteArray(cadena);
    byte[] mac_key = hexStringToByteArray(key);

    // System.out.println(new String(data_for_mac)); <-- what is this????

    byte[] mac =  calculateMAC(data_for_mac,mac_key);
}

我进行了测试,并通过这两个小更改,您获得了预期的结果。

顺便说一句,我希望您肯定没有在此示例代码中发布所有重要的密钥,而您只是在使用一个虚拟密钥。 :D