Существует разница между SHA-256
и HMAC-SHA-256
.
HMAC-SHA-256
(см. Также HMAC
) - алгоритм генерации MAC
с использованием хеша SHA-256
-алгоритм.
Результат первого Java-кода и C # -кода различен, потому что Java-код использует SHA-256
, а C # -код HMAC-SHA-256
.
Поскольку вы хотите использовать HMAC-SHA-256
, я сосредотачиваюсь на этом и игнорирую первый Java-код.
Результат C # -кода для текста
This is an arbitrary text!
с ключом
1234567890
есть
25583e6e0b6c2c3a5c50ebd9ea48138a960a7ca2a215fae2b4b82ee99734deb4
Второй Java-код также использует HMAC-SHA-256
. Если вы замените строки
data = bytesToHex(sha256Hmac.doFinal(data.getBytes(StandardCharsets.UTF_8)));
System.out.println(data);
с
data = bytesToHex(sha256Hmac.doFinal(value.getBytes(StandardCharsets.UTF_8)));
return data;
тогда результат будет тем же (при условии, что ваш (не опубликованный) bytesToHex
-метод работает должным образом, см., Например, Как преобразовать байтовый массив в шестнадцатеричную строку в Java? ).
Кстати, во втором Java-коде вы должны изменить метку salt
на что-то вроде key
, поскольку это обычная формулировка в контексте MAC
. salt обычно используется в сочетании с хэшированием пароля, как в вашем первом Java-коде.
Примечание: в Java-коде нельзя использовать пустой байтовый массив в качестве SecretKeySpec
-входа. Это бросает IllegalArgumentException (Empty key)
. Тем не менее, HMACSHA256
-актор в C # -коде принимает пустой байтовый массив и внутренне дополняет его 0-значениями. Таким образом, что касается вашего тестового случая (текст: abcd
, пустой ключ), вы можете смоделировать в Java-коде пустой байтовый массив байтовым массивом, содержащим одно значение 0. Тогда вывод Java-кода равен выводу C # -кода. Конечно, пустой ключ должен использоваться только для этого теста.