根据rfc2202在java中实现hmac-sha1

时间:2016-01-05 13:45:54

标签: java cryptography hmacsha1

我正在寻找在java中实现hmac-sha1的解决方案,这将给出与rfc2202文档中描述的输出相同的输出。 https://tools.ietf.org/html/rfc2202.html(3。HMAC-SHA-1的测试用例)

我试着编写一些代码,但我还远没有解决方案。最后我在这里找到了函数:https://stackoverflow.com/a/8396600并且它在rfc2202的测试用例2中为我工作,其中key =" Jefe"和数据="你什么都不想要什么?"我需要更多的输入作为字节数组,所以我改变它,因为它在下面,但它没有给我正确的摘要。那么我需要做些什么来使这个代码工作?我想它是字节数组的东西,但我可能不熟悉java并且没有任何想法。

这就是我给这个函数输入的方法(来自rfc2202的测试用例3):

byte[] key = new byte[20];
Arrays.fill(key, (byte) 10);
byte[] data = new byte[50];
Arrays.fill(data, (byte) 0xdd);
System.out.println(Prf.hmacsha1Digest(data, key));

功能代码:

public static String hmacsha1Digest(byte[] msg, byte[] keyin) throws InvalidKeyException {
String digest = null;
String algo = "HmacSHA1";

try {
  SecretKeySpec key = new SecretKeySpec(keyin, algo);
  Mac mac = Mac.getInstance(algo);
  mac.init(key);

  byte[] bytes = mac.doFinal(msg);

  StringBuffer hash = new StringBuffer();
  for (int i = 0; i < bytes.length; i++) {
    String hex = Integer.toHexString(0xFF & bytes[i]);
    if (hex.length() == 1) {
      hash.append('0');
    }
    hash.append(hex);
  }
  digest = hash.toString();
} catch (InvalidKeyException e) {
} catch (NoSuchAlgorithmException e) {
}
return digest;
}

1 个答案:

答案 0 :(得分:2)

测试用例3的关键是错误的。它应该是:

byte[] key = new byte[20];
Arrays.fill(key, (byte) 0xaa);