Взаимодействие: HmacSHA1 в Java и dotNet - PullRequest
2 голосов
/ 19 апреля 2010

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

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 на обеих платформах, но используя то, что уже существует ....

Спасибо!

1 Ответ

5 голосов
/ 19 апреля 2010

С этим кодом 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)

...