2014-11-22 14 views
11

Elixir'de bir Amazon Product Advertising API istemcisi yazmaya çalışıyorum. Geliştirici kılavuzu, bir HMAC-SHA26 hash'ının istek ve "Gizli Erişim Anahtarı" kullanılarak oluşturulması gereken the process for signing an API request'u açıklamaktadır.Elixir'de bir HMAC dizesi nasıl oluşturulur?

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 

işlevi geçirilen url şöyle görünür: Bu benim isteği imzalama işlemek için yazdım fonksiyonudur 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 yaşadığım sorun olduğunu

, o :crypto.hmac/3 bir ikili döner iken, Bu ikili bir dize değil; dönüş değerini String.valid?/1'a iletmek false değerini döndürür. Bu nedenle, isteği imzalamak için url dizesinin sonuna dönüş değerini birleştiremiyorum.

:crypto.hmac/3 yanlış kullanıyorum? Kaybettiğim bir şey mi var? Bu konuda gitmem gereken alternatif bir yol var mı?

+1

den maç örneğidir Elixir'de interpolasyon. http://elixir-lang.org/getting_started/2.html#2.4-strings Kodunuzu biraz kolaylaştırabilir. –

cevap

24

onun dönüş baz ikili formatta 16 tamsayı :crypto.hmac/3 kullanarak, sorunun böyle çözülebilir:

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

Bu da dize kullanarak içine bakmak isteyebilirsiniz https://en.wikipedia.org/wiki/Hash-based_message_authentication_code#Examples_of_HMAC_.28MD5.2C_SHA1.2C_SHA256.29

+5

Veya belki Base.encode16 kullanın (: crypto.hmac (: sha256, "anahtar", "Hızlı kahverengi tilki tembel köpeğin üstünden atlar") |> Base.encode16) – sasajuric

+0

@sasajuric'in yorumunda önerilen çözümü kullandım çünkü bir satır daha az ve okumak daha kolay. –

+3

Bu, cevabın içindekilerle aynı değil. Fark, "hmac_bytes |> Base.encode16" ve "hmac_bytes |> Base.encode16 |> Base.encode16'" ile aynıdır. Kodlama iki kez yerinde görünmüyor. – pkoch