Как создать цепочку HMAC в Elixir?

Я пытаюсь написать клиент API рекламы продукта Amazon в Elixir. В руководстве разработчика описывается процесс подписания запроса API, в котором должен быть создан хэш HMAC-SHA26 с использованием запроса и "секретного ключа доступа". Это функция, которую я написал для обработки подписи запроса:

defp sign_request(url) do
  url_parts = URI.parse(url)
  request = "GET\n" <> url_parts.host <> "\n" <> url_parts.path <> "\n" <> url_parts.query
  url <> "&Signature=" <> :crypto.hmac(:sha256, 'ThisIsMySecretAccessKey', request)
end

URL-адрес, переданный в функцию, выглядит примерно так: http://webservice.amazon.com/onca/xml?AssociateTag=ThisIsMyAssociateTag&AWSAccessKeyId=ThisIsMyAWSAccessKeyId&Keywords=stuff&Operation=ItemSearch&SearchIndex=Apparel&Service=AWSECommerceService&Timestamp=2014-11-22T12%3A00%3A00Z&Validate=True&Version=2013-08-01

Проблема, с которой я сталкиваюсь, заключается в том, что, хотя :crypto.hmac/3 возвращает двоичный код, этот двоичный код не является строкой; передача возвращаемого значения в String.valid?/1 возвращает false. Таким образом, я не могу связать возвращаемое значение в конце строки URL, чтобы подписать запрос.

Я неправильно использую :crypto.hmac/3? Есть что-то, что мне не хватает? Есть ли альтернативный способ, которым я должен заниматься?

Ответ 1

Когда вы используете :crypto.hmac/3 его целочисленное целое число 16 в двоичном формате, ваша проблема может быть решена следующим образом:

:crypto.hmac(:sha256, "key", "The quick brown fox jumps over the lazy dog")
|> Base.encode16

Это пример соответствия https://en.wikipedia.org/wiki/Hash-based_message_authentication_code#Examples_of_HMAC_.28MD5.2C_SHA1.2C_SHA256.29