2012-04-19 32 views
0

亞馬遜有一些examples用HMAC簽名他們的REST呼叫。但是,在Metro/WinRT應用程序中使用以下代碼時,簽名不匹配。亞馬遜REST呼叫的HMAC簽名在WinRT上不正確

方法計算HMAC:

internal string CreateHMAC(
     string message, 
     string algorithmName, 
     string key) 
    { 
     MacAlgorithmProvider macAlgorithmProvider = MacAlgorithmProvider.OpenAlgorithm(algorithmName); 
     var binaryMessage = CryptographicBuffer.ConvertStringToBinary(message, BinaryStringEncoding.Utf8); 
     var binaryKeyMaterial = CryptographicBuffer.ConvertStringToBinary(key, BinaryStringEncoding.Utf8); 
     var hmacKey = macAlgorithmProvider.CreateKey(binaryKeyMaterial); 
     var binarySignedMessage = CryptographicEngine.Sign(hmacKey, binaryMessage); 
     var signedMessage = CryptographicBuffer.EncodeToBase64String(binarySignedMessage); 
     return signedMessage; 
    } 

測試,以檢查例如:

var hmac = this.Amazon.CreateHMAC("GET\nwebservices.amazon.com\n/onca/xml\nAWSAccessKeyId=AKIAIOSFODNN7EXAMPLE&ItemId=0679722769&Operation=ItemLookup&ResponseGroup=ItemAttributes%2COffers%2CImages%2CReviews&Service=AWSECommerceService&Timestamp=2009-01-01T12%3A00%3A00Z&Version=2009-01-06", "HMAC_SHA256", "1234567890"); 
var encoded = WebUtility.UrlEncode(hmac); 
Assert.AreEqual("Nace%2BU3Az4OhN7tISqgs1vdLBHBEijWcBeCqL5xN9xg%3D", encoded); 

和實際的結果是:

M%2fy0%2bEAFFGaUAp4bWv%2fWEuXYah99pVsxvqtAuC8YN7I%3d 

有任何其他人成功創建HMAC在WinRT上?或者你能看到我在做什麼錯了嗎?

回答

0

亞馬遜的文檔不正確/過時 - 使用ecs.amazonaws.com代替webservices.amazon.com

因此簽署本:

GET \ necs.amazonaws.com \ N/onca/XML \ nAWSAccessKeyId = AKIAIOSFODNN7EXAMPLE &項目Id = 0679722769 &操作= ItemLookup & ResponseGroup = ItemAttributes中%2COffers%2CImages%2CReviews &服務= AWSECommerceService &時間戳= 2009-01-01T12%3A00%3A00Z &版本= 2 009-01-06

對不起,這是一個非常快速的答覆!

0

amazon的關鍵是一個Base64字符串,因此您需要將此字符串轉換爲IBuffer對象,但從已經作爲Base 64字符串公開的二進制內容開始。你正在將一個正常的字符串轉換爲二進制,但情況並非如此。 試試這個

var algorithmProvider = MacAlgorithmProvider.OpenAlgorithm(algorithmName); 

var binaryKeyMaterial = CryptographicBuffer.DecodeFromBase64String(key); 
var hmacKey = algorithmProvider.CreateKey(binaryKeyMaterial); 

在這篇博客文章中,我寫了一篇關於how to create the signature from WinRT是西班牙語,但代碼是通用的,你可以通過必應翻譯或其他一些翻譯。