2010-04-19 6 views
2

В приложении мы вычисляющий SHA1Hmac в Java, используя следующий:Interop: HmacSHA1 в Java и Dotnet

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

И спустя HMAC проверяется в C# - на SmartCard - с помощью:

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

+0

Да, опечатка, спасибо, что указали это (исправлено сейчас) – wilth

ответ

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)). Как показывает мой код, реализация Java HMAC/SHA-1 верна, и вы вызываете ее правильно. Я предполагаю, что вы не вводите правильные данные или ключ.

(я использую JDK от Sun 1.6.0_16)

+0

У меня действительно была проблема с кодом в java, ваше сообщение помогло мне точно определить ее. большое спасибо! – wilth

Смежные вопросы