Кодировка HMAC в R против Python

1

Я пытаюсь создать токен для вызова API в R. У меня есть пример кода и вывод в Python, но я не могу реплицировать в R. Я мало что знаю о кодировании, расшифровке и т.д. Надеюсь, кто-то может пролить некоторый свет на том, что я могу сделать, чтобы совместить эти выходы. Вот пример игрушки.

R Код:

library(RCurl)
library(digest)

api_key = "abcdefghijklmnopqrstuvwxyz123456789=="
decoded_api_key = base64Decode(api_key)
hmac_binary = hmac(decoded_api_key, "MySpecialString", "sha512")
hmac_encoded = base64Encode(digest(hmac_binary))
print(as.character(hmac_encoded))
# ZmZjZDBlMjkyNzg3NDNmYWM1ZDcyNjVkNmY4ZmM1OGQ=

Python:

import hmac
import hashlib
import base64

api_key = "abcdefghijklmnopqrstuvwxyz123456789=="
decoded_api_key = base64.b64decode(api_key)
hmac_binary = hmac.new(decoded_api_key, "MySpecialString", hashlib.sha512)
hmac_encoded = base64.b64encode(hmac_binary.digest())
print(hmac_encoded)
# MduxNfXVkwcOtCpBWJEl96S43boYVYTtHb4waR21ARCMo6iokKuxbwEJMTkuytbrCOxvBqKCYiaZiV/AyHTEcw==

Ответы, которые я получаю, приведены в конце блоков кода. Ясно, что они не совпадают. Я хотел бы, чтобы кто-то помог мне изменить свой R-код, чтобы он соответствовал выходу Python.

Заранее спасибо.

Теги:
hmac

1 ответ

2
Лучший ответ

Функция digest() в R не делает то же самое, что и метод .digest() в python. Он не извлекает значение, он вычисляет новый дайджест за все, что вы передаете. Также функция hmac по умолчанию возвращает строку с байтами в ней, но вы хотите, чтобы base64 кодировал фактические байты, поэтому вам нужно убедиться для запроса необработанных значений. Наконец, строка base64 должна содержать несколько символов в строке. Дополнительное дополнение, похоже, возвращает другое значение. Таким образом, это должно давать то же значение, что и код python

api_key = "abcdefghijklmnopqrstuvwxyz123456789="
decoded_api_key = base64Decode(api_key)
hmac_binary = hmac(decoded_api_key, "MySpecialString", "sha512", raw=TRUE)
hmac_encoded = base64Encode(hmac_binary)
print(as.character(hmac_encoded))
# [1] "MduxNfXVkwcOtCpBWJEl96S43boYVYTtHb4waR21ARCMo6iokKuxbwEJMTkuytbrCOxvBqKCYiaZiV/AyHTEcw=="
  • 0
    Огромное спасибо. Работает отлично.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню