2015-05-03 50 views
1

我下面這個例子無法使用HMAC SHA256再現來自例如AWS簽名

http://docs.aws.amazon.com/AmazonS3/latest/API/sigv4-query-string-auth.html

,並試圖重現爲他們國家作爲簽名的64個字符串......

aeeed9bbccd4d02ee5c0109b86d86835f995330da4c265957d157751f604d404 

我已成功將Canonical Request的十六進制值與匹配的字符串進行匹配,並肯定StringToSign字符串是正確的。

最後一塊是計算簽名和簽名。這是我使用的紅寶石提供的功能擊中路障「getSignatureKey」

http://docs.aws.amazon.com/general/latest/gr/signature-v4-examples.html#signature-v4-examples-ruby

signing_key = getSignatureKey secret_access_key, current_date, region, aws_service 
signature = OpenSSL::HMAC.digest('sha256', signing_key, string_to_sign) 


def getSignatureKey key, dateStamp, regionName, serviceName 
    kDate = OpenSSL::HMAC.digest('sha256', "AWS4" + key, dateStamp) 
    kRegion = OpenSSL::HMAC.digest('sha256', kDate, regionName) 
    kService = OpenSSL::HMAC.digest('sha256', kRegion, serviceName) 
    kSigning = OpenSSL::HMAC.digest('sha256', kService, "aws4_request") 

    kSigning 
end 

電流輸出爲「簽名」是這個奇怪的字符序列。

ٻ。H53ê} WQ

缺少什麼我拿到簽名等於...

aeeed9bbccd4d02ee5c0109b86d86835f995330da4c265957d157751f604d404 

回答

1

您的「奇怪的字符序列」實際上可能是正確的輸出。

OpenSSL::HMAC.digest吐出二進制表示的值,和你比較,爲十六進制表示

檢查時看到您打印出來的簽名將其轉換爲十六進制表示,像這樣以後會發生什麼值:

signature.each_byte.map { |b| "%02x" % b }.join 
+0

它已關閉,但存在三個缺少零的實例。我在下面的十六進制中放了一個X來演示。我想知道爲什麼零不見了? aeeed9bbccd4d02ee5c0109b86d86835f99533Xda4c265957d157751f6X4d4X4 vs –

+0

我看,這是很容易解決的,將更新我的回答 –

1

我不能從你的文章中發現,但這些結果可能完全相同,格式不同。

您的代碼返回HMAC操作的原始結果 - 這是任意的二進制數據,因此它不會打印任何可讀的內容。亞馬遜期望您提供每個字節的十六進制表示法:您的第一對字節是「\ xae \ xee」而不是「aeee」

最簡單的方法是撥hexdigest而不是digest。請注意,只應在最終的HMAC(在簽署字符串時用簽名密鑰簽名)而不是在構建簽名密鑰時執行此操作。

+0

做到了。謝謝。所以通過在最終計算中將.digest更改爲.hexdigest,我能夠得到正確的十六進制簽名= OpenSSL :: HMAC.hexdigest('sha256',signing_key,string_to_sign) –