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

我试图编写一些代码,但是我离解决方案还很远。最终,我在这里找到了函数:https://stackoverflow.com/a/8396600,它在rfc2202的测试用例2中对我有用,其中key =“ Jefe”和data =“ ya想要什么?我需要更多的输入才能作为字节数组,所以我在下面进行了更改,但它没有给我正确的摘要。那么,我需要做些什么才能使此代码起作用?我想这是字节数组的东西,但我可能对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;
}

最佳答案

对于测试用例3,密钥是错误的。它应该是:

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

09-12 09:44