2010-04-19 336 views
2

在應用程序中,我們在Java中使用計算SHA1Hmac如下:互操作性:HMACSHA1用Java和DOTNET

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

及更高版本,HMAC是在C#中驗證 - 在智能卡上 - 使用:

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

但是,結果並不相同。我忽略了一些重要的東西嗎

輸入似乎是相同的。這裏是一些採樣輸入:

Data: 546573746461746131323341fa3c35 
Key: 6d795472616e73616374696f6e536563726574 

Result Java: 37dbde318b5e88acbd846775e38b08fe4d15dac6 
Result C#: dd626b0be6ae78b09352a0e39f4d0e30bb3f8eb9 

我不介意實現我自己在兩個平臺上HMACSHA1,但使用已經存在的東西....

謝謝!

+0

也許一個錯字,但你不應該通過「鑰匙」 m.init而不是「祕密」? – EventHorizon 2010-04-19 10:55:46

+0

是的,一個錯字,感謝您指出(現在糾正它) – wilth 2010-05-04 03:12:58

回答

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)

+0

我確實在java中有一個代碼問題,您的文章幫助我找出它。多謝! – wilth 2010-05-04 03:28:17