Использование HMAC SHA256 в Ruby
Я пытаюсь применить HMAC-SHA256 для генерации ключа для Rest API.
Я делаю что-то вроде этого:
def generateTransactionHash(stringToHash)
key = '123'
data = 'stringToHash'
digest = OpenSSL::Digest.new('sha256')
hmac = OpenSSL::HMAC.digest(digest, key, data)
puts hmac
end
Результат этого всегда таков: (если я поставлю "12345" в качестве параметра или "HUSYED815X", я получаю то же самое)
ۯw/{o���p�T����:��a�h��E|q
API не работает из-за этого... Может ли кто-нибудь помочь мне в этом?
Ответы
Ответ 1
Согласно документации OpenSSL::HMAC.digest
Возвращает код аутентификации, который экземпляр представляет в виде двоичной строки.
Если у вас возникли проблемы с использованием этого, возможно, вам нужна шестнадцатеричная форма, предоставленная OpenSSL::HMAC.hexdigest
Пример
key = 'key'
data = 'The quick brown fox jumps over the lazy dog'
digest = OpenSSL::Digest.new('sha256')
OpenSSL::HMAC.digest(digest, key, data)
#=> "\xF7\xBC\x83\xF40S\x84$\xB12\x98\xE6\xAAo\xB1C\xEFMY\xA1IF\x17Y\x97G\x9D\xBC-\x1A<\xD8"
OpenSSL::HMAC.hexdigest(digest, key, data)
#=> "f7bc83f430538424b13298e6aa6fb143ef4d59a14946175997479dbc2d1a3cd8"
Ответ 2
Попробуйте следующее:
hmac = OpenSSL::HMAC.hexdigest(OpenSSL::Digest.new('sha256'), key, data)
Ответ 3
В моем случае (Ticketmatic) мне пришлось создать HMAC, как указано выше, и добавить заголовок авторизации к запросу с HMAC в нем.
hmac = OpenSSL::HMAC.hexdigest(OpenSSL::Digest.new('sha256'), secret_key, access_key + name + time)
req = Net::HTTP::Get.new(uri)
req['Authorization'] = "TM-HMAC-SHA256 key=#{access_key} ts=#{time} sign=#{hmac}"
res = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) { |http| http.request(req) }
Вы можете найти полную суть здесь
И блог с более подробным объяснением здесь