2

在一个应用程序中,我们使用以下方法在 java 中计算 SHA1Hmac:

SecretKey key = new SecretKeySpec(secret, "HmacSHA1");
Mac m = Mac.getInstance("HmacSHA1");
m.init(key);
byte[] hmac = m.doFinal(data);

后来,在 C# 中验证了 hmac - 在 SmartCard 上 - 使用:

  HMACSHA1 hmacSha = new HMACSHA1(secret);
  hmacSha.Initialize();
  byte[] hmac = hmacSha.ComputeHash(data);

然而,结果却不尽相同。我是否忽略了一些重要的事情?

输入似乎是相同的。这里有一些示例输入:

Data: 546573746461746131323341fa3c35
Key: 6d795472616e73616374696f6e536563726574

Result Java: 37dbde318b5e88acbd846775e38b08fe4d15dac6
Result C#:   dd626b0be6ae78b09352a0e39f4d0e30bb3f8eb9

我不介意在两个平台上实现我自己的 hmacsha1,但是使用已经存在的......

谢谢!

4

1 回答 1

5

使用此 Java 代码:

static byte[] doHMAC(byte[] data, byte[] secret)
{
    SecretKey key = new SecretKeySpec(secret, "HmacSHA1");
    Mac m = Mac.getInstance("HmacSHA1");
    m.init(key);
    return m.doFinal(data);
}

然后我得到了dd626b0be6ae78b09352a0e39f4d0e30bb3f8eb9你从 C# 实现中得到的。此外,我已经验证了关于我自己的 HMAC 和 SHA-1 实现(在 Java 中)的值,我也得到了这个结果。

似乎您的 Java 代码有缺陷,但不是在您展示的部分(除了您m.init(secret)不能编译的部分 - 它必须是m.init(key))。正如我的代码所示,HMAC/SHA-1 的 Java 实现是正确的,并且您可以正确调用它。我的猜测是您没有输入正确的数据或密钥。

(我使用的是 Sun 的 JDK 1.6.0_16)

于 2010-04-19T14:05:03.980 回答