2010-04-19 7 views
2

Dans une application, nous calculons un SHA1Hmac en Java en utilisant les éléments suivants:Interop: HMACSHA1 en Java et dotNet

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

Et plus tard, le HMAC est vérifiée en C# - sur une carte à puce - en utilisant:

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

Cependant, le résultat n'est pas le même. Ai-je négligé quelque chose d'important?

Les entrées semblent être les mêmes. Voici quelques exemples: entrées

Data: 546573746461746131323341fa3c35 
Key: 6d795472616e73616374696f6e536563726574 

Result Java: 37dbde318b5e88acbd846775e38b08fe4d15dac6 
Result C#: dd626b0be6ae78b09352a0e39f4d0e30bb3f8eb9 

Je ne me dérangerait pas de mettre en œuvre ma propre HMACSHA1 sur les deux plates-formes, mais en utilisant ce qui existe déjà ....

Merci!

+0

Peut-être une faute de frappe de, mais ne devrait pas vous passer « clé » à m.init au lieu de « secret »? – EventHorizon

+0

Oui, une faute de frappe, merci de le signaler (corrigé maintenant) – wilth

Répondre

5

Avec ce code 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); 
} 

puis-je obtenir le dd626b0be6ae78b09352a0e39f4d0e30bb3f8eb9 qui est ce que vous avez de votre implémentation C#. Aussi, j'ai vérifié cette valeur en ce qui concerne ma propre implémentation HMAC et SHA-1 (en Java) et j'obtiens aussi ce résultat.

Il semble que votre code Java est défectueux, mais pas dans la partie que vous affichez (sauf votre m.init(secret) qui ne compile pas - il doit être m.init(key)). Comme mon code le montre, l'implémentation Java de HMAC/SHA-1 est correcte et vous l'appelez correctement. Je suppose que vous ne saisissez pas les bonnes données ou clés.

(je me sers de Sun JDK 1.6.0_16)

+0

J'ai effectivement eu un problème de code en Java, votre poste m'a aidé à le localiser. Merci beaucoup! – wilth