wil*_*lth 2 c# java interop cryptography hmac
在一个应用程序中,我们使用以下方法在java中计算SHA1Hmac:
SecretKey key = new SecretKeySpec(secret, "HmacSHA1");
Mac m = Mac.getInstance("HmacSHA1");
m.init(key);
byte[] hmac = m.doFinal(data);
Run Code Online (Sandbox Code Playgroud)
后来,在C#中验证了hmac - 在SmartCard上 - 使用:
HMACSHA1 hmacSha = new HMACSHA1(secret);
hmacSha.Initialize();
byte[] hmac = hmacSha.ComputeHash(data);
Run Code Online (Sandbox Code Playgroud)
但是,结果并不相同.我忽略了重要的事情吗?
输入看起来是一样的.这里有一些示例输入:
Data: 546573746461746131323341fa3c35
Key: 6d795472616e73616374696f6e536563726574
Result Java: 37dbde318b5e88acbd846775e38b08fe4d15dac6
Result C#: dd626b0be6ae78b09352a0e39f4d0e30bb3f8eb9
Run Code Online (Sandbox Code Playgroud)
我不介意在两个平台上实现我自己的hmacsha1,但使用已经存在的内容....
谢谢!
使用此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);
}
Run Code Online (Sandbox Code Playgroud)
然后我得到了dd626b0be6ae78b09352a0e39f4d0e30bb3f8eb9你的C#实现中的内容.此外,我已经验证了我自己的HMAC和SHA-1实现(在Java中)的价值,我也得到了这个结果.
看来你的Java代码是有缺陷的,但是你所展示的部分却没有(除了m.init(secret)那些不编译的东西 - 它必须是m.init(key)).正如我的代码所示,HMAC/SHA-1的Java实现是正确的,您可以正确地调用它.我的猜测是你没有输入正确的数据或密钥.
(我使用的是Sun的JDK 1.6.0_16)
| 归档时间: |
|
| 查看次数: |
1689 次 |
| 最近记录: |