如何在Elixir中生成HMAC字符串?

问题描述 投票:11回答:1

我正在尝试在Elixir中编写Amazon Product Advertising API客户端。开发人员指南描述了the process for signing an API request,其中必须使用请求和“秘密访问密钥”创建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

我遇到的问题是,while:crypto.hmac/3返回二进制文件,该二进制文件不是字符串;将返回值传递给String.valid?/1会返回false。因此,我无法将返回值连接到url字符串的末尾以对请求进行签名。

我不正确地使用:crypto.hmac/3吗?有什么我想念的吗?我还有另一种方法吗?

hmac sha256 otp elixir amazon-product-api
1个回答
26
投票

当您使用: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的匹配示例

© www.soinside.com 2019 - 2024. All rights reserved.