Что вызывает несоответствие функций HMAC в R против Python при использовании.digest()?

Я пытаюсь написать некоторые функции для подключения к IBM Cloud Object Storage с использованием протоколов подписи AWS версии 4. Здесь есть некоторый шаблонный код, который работает в Python, но когда я пытаюсь преобразовать код в R I, я попадаю в загадку.

При использовании функций HMAC в R & Python .hexdigest() Метод выдает одинаковые выходные данные для одной и той же строки на обоих языках:

# Python
import hmac
import hashlib
>>> hmac.new("key", "message".encode('utf-8'), hashlib.sha256).hexdigest()
'6e9ef29b75fffc5b7abae527d58fdadb2fe42e7219011976917343065f58ed4a

# R
library(digest)
> hmac("key", enc2utf8("message"), "sha256")
[1] "6e9ef29b75fffc5b7abae527d58fdadb2fe42e7219011976917343065f58ed4a"

Если вы используете .digest() метод в Python из crypto библиотека - которую предлагает код из AWS/IBM - тогда вы получите вывод ASCII. Я могу приблизить этот выход ASCII в R, изменив hmac() вывод в raw, а затем преобразование в символ. Ниже вы можете видеть, что это не совсем то же самое - хотя это близко.

# Python
>>> hmac.new("key", "message".encode('utf-8'), hashlib.sha256).digest()
"n\x9e\xf2\x9bu\xff\xfc[z\xba\xe5'\xd5\x8f\xda\xdb/\xe4.r\x19\x01\x19v\x91sC\x06_X\xedJ"

# R
> rawToChar(hmac("key", "message", "sha256", raw = T))
[1] "n\x9e\xf2\x9bu\xff\xfc[z\xba\xe5'Տ\xda\xdb/\xe4.r\031\001\031v\x91sC\006_X\xedJ"

Что вызывает несоответствие здесь? Исходный код и документы для .digest() говорит, что возвращает строку 8-битных данных, которые могут содержать байты не ASCII. Как я могу воспроизвести этот вывод в R?

В конечном счете, я считаю, что именно это приводит к сбою моих подписей при попытке аутентификации в IBM Cloud Object Storage. Будем весьма благодарны за любую помощь или альтернативные предложения для библиотек HMAC в Python/R!

0 ответов

Другие вопросы по тегам