HMAcSHA256在JAVA中哈希

时间:2016-09-30 06:23:13

标签: java encryption hash sha hmac

我获得了一组获取数据哈希的步骤。我现在试图理解这些步骤很长时间了,但我得到的哈希值似乎与预期的哈希值不匹配。

提到的步骤如下:

  1. 使用FIN消息输入作为二进制值(C语言中的unsigned char,Java中的byte)。 FIN消息输入必须以ASCII字符集编码。
  2. 将左LAU键和右LAU键组合为一个字符串。合并的LAU密钥必须用作二进制值(C语言中的unsigned char,Java中的byte)。合并的LAU密钥必须以ASCII字符集编码。
  3. 调用HMAC256例程来计算哈希值。哈希值也必须被视为二进制值(C语言中的unsigned char,Java中的byte)。 hmac大小为32个字节。
  4. 将hmac二进制值转换为大写十六进制可打印字符(例如,一字节二进制值0000 1010的十六进制值为0x0A,并将转换为两个字符“0A”)。
  5. 这是我尝试过的。

    import javax.crypto.Mac;
    import javax.crypto.spec.SecretKeySpec;
    import javax.xml.bind.DatatypeConverter;
    
    import java.security.InvalidKeyException;
    import java.security.NoSuchAlgorithmException;
    import org.apache.commons.codec.binary.Hex;
    
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.UnsupportedEncodingException;
    import java.math.BigInteger;
    import java.nio.charset.StandardCharsets;
    
    
    public class ABCHash{
            public static void main(String[] args) throws Exception        
            {
                    try{
                            int character;
                            StringBuffer buffer = new StringBuffer("");
                            FileInputStream inputStream = new FileInputStream(new File("C:/EncPDF.txt"));
    
                            while( (character = inputStream.read()) != -1)
                                    buffer.append((char) character);
    
                            inputStream.close();
                            System.out.println("Fetching data from the file"+buffer);
    
                            StringBuffer sbuf = new StringBuffer(buffer);
    
                            String str=sbuf.toString();
    
                            System.out.println( "Data = "+ str);
                            if(str!=null)
                            {
                                    String key = "0123456789ABCDEF0123456789ABCDEF"; // Assuming the key as 0123456789ABCDEF
    
                                    byte[] hexvalue= stringToHexByte(str);
                                    byte[] hexkey=stringToHexByte(key);
                                    byte[] byHMAC = encode(hexkey, hexvalue);
                                    String stEncryptedData = Hex.encodeHexString(byHMAC).toUpperCase();
    
                                    System.out.println("Encrypted data =\n "+stEncryptedData);
                            }
                    }
                    catch(Exception e)
                    {
                            System.out.println("Exception in the file reading"+e);
                    }
    
            }
    
            private static byte[] encode(byte[] hexkey, byte[] hexvalue) {
                    try {
                            Mac sha256_HMAC = Mac.getInstance("HmacSHA256");
                            SecretKeySpec secret_key = new SecretKeySpec(hexkey, "HmacSHA256");
                            sha256_HMAC.init(secret_key);
    
                            return sha256_HMAC.doFinal(hexvalue);
    
                    } catch (NoSuchAlgorithmException e) {
                            e.printStackTrace();
                    } catch (InvalidKeyException e) {
                            e.printStackTrace();
                    }
    
                    return null;
            }
    
            public static String stringToHex(String base) throws UnsupportedEncodingException
            {
                    return String.format("%040x", new BigInteger(1, base.getBytes(StandardCharsets.US_ASCII)));
            }
    
            public static byte[] stringToHexByte(String base) throws UnsupportedEncodingException
            {
                    System.out.println(stringToHex(base).toUpperCase());
                    return DatatypeConverter.parseHexBinary(stringToHex(base).toUpperCase());
            }
    
    }
    

    如果有人可以指出执行方面的错误,那将会非常有用。

1 个答案:

答案 0 :(得分:0)

您是否查看了HMAC-SHA256 Algorithm for signature calculationhttps://www.jokecamp.com/blog/examples-of-creating-base64-hashes-using-hmac-sha256-in-different-languages/#java

你的stringToHexString()看起来有点复杂。您应该将结果和期望值放在一起。