首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >互操作: Java和dotNet中的HmacSHA1

互操作: Java和dotNet中的HmacSHA1
EN

Stack Overflow用户
提问于 2010-04-19 15:13:57
回答 1查看 1.7K关注 0票数 2

在应用程序中,我们使用以下公式计算java中的SHA1Hmac:

代码语言:javascript
复制
SecretKey key = new SecretKeySpec(secret, "HmacSHA1");
Mac m = Mac.getInstance("HmacSHA1");
m.init(key);
byte[] hmac = m.doFinal(data);

然后,在SmartCard上的C#中使用以下命令验证hmac:

代码语言:javascript
复制
  HMACSHA1 hmacSha = new HMACSHA1(secret);
  hmacSha.Initialize();
  byte[] hmac = hmacSha.ComputeHash(data);

然而,结果并不相同。我是不是忽略了什么重要的东西?

输入似乎是相同的。下面是一些示例输入:

代码语言:javascript
复制
Data: 546573746461746131323341fa3c35
Key: 6d795472616e73616374696f6e536563726574

Result Java: 37dbde318b5e88acbd846775e38b08fe4d15dac6
Result C#:   dd626b0be6ae78b09352a0e39f4d0e30bb3f8eb9

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

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-04-19 22:05:04

使用下面的Java代码:

代码语言:javascript
复制
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 1.6.0_16)

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2665731

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档