Метод Android (Java), эквивалентный Python HMAC-SHA256 в шестнадцатеричном формате

Я пытаюсь воспроизвести эквивалент Python HMAC-SHA256 в Android (Java). Представление Python показано ниже с правильным выводом:

Питон

print (hmac.new(key = binascii.unhexlify("0123465789"),msg = binascii.unhexlify("ABCDEF"),digestmod=hashlib.sha256).hexdigest()).upper()

Output
5B5EE08A20DDD645A31384E51AC581A4551E9BE5AC8BF7E690A5527F2B9372CB

Однако я не могу получить тот же результат на Java, используя приведенный ниже код:

Джава

Mac sha256_HMAC = Mac.getInstance("HmacSHA256");
SecretKeySpec secretKey = new SecretKeySpec("0123465789".getBytes("UTF-8"), "HmacSHA256");      
sha256_HMAC.init(secretKey);
byte[] hash = sha256_HMAC.doFinal("ABCDEF".getBytes("UTF-8"));      
String check = (new String(Hex.encodeHex(hash))).toUpperCase();
System.out.println(check);

Output
46F9FD56BDAE29A803BAD5BC668CB78DA4C54A51E6C031FB3BC2C42855047213

Я совершенно уверен, что моя проблема заключается в том, что я не могу закодировать Java-эквивалент Python:

key = binascii.unhexlify("0123465789")

&

msg = binascii.unhexlify("ABCDEF") 

Это связано с тем, что, когда я не выполняю binascii.unhexlify для входных данных Hex-String в Python, я получаю одинаковые результаты для обоих методов. Однако для Python HMAC-SHA256 требуется операция binascii.unhexlify.

Я провел много исследований и даже попытался импортировать метод, который Python использует для выполнения binascii.unhexlify в Java, но я все еще не могу получить идентичные результаты. Любая помощь и / или совет будут более чем оценены в решении этой проблемы. Кто-нибудь может мне помочь?


person user3801679    schedule 03.07.2014    source источник
comment
Вы используете шестнадцатеричное декодирование ключа и сообщения в своем коде Python, поэтому в Java вместо использования "0123465789".getBytes("UTF-8") вам, очевидно, необходимо строки hex-decode, представляющие ключ и сообщение.   -  person Oleg Estekhin    schedule 04.07.2014
comment
возможный дубликат Python HMAC-SHA1 и Java HMAC-SHA1 разные результаты, вероятно, не лучший выбор для дубликата, но суть проблемы та же: если шестнадцатеричный код используется в одном языке, используйте шестнадцатеричный код и в другом языке в соответствующих местах.   -  person Oleg Estekhin    schedule 04.07.2014
comment
@user3801679 user3801679 ты нашел решение?   -  person Taranfx    schedule 12.09.2014


Ответы (1)


Это может помочь... Я создал код для создания хеша на Java и Python и загрузил код на Github.

Обе программы создают один и тот же хеш-код в base64.

URL-адрес репозитория: https://github.com/AsadShakeel/HMAC-Java-Python-Hashing

person Asad Shakeel    schedule 31.05.2021