2011-11-30 61 views
1

當人們&公司不提供其產品的可靠文檔時,我變得非常沮喪。無法模仿亞馬遜網絡服務簽名算法

根據這個網站:http://s3.amazonaws.com/doc/s3-developer-guide/RESTAuthentication.html

有看起來像這樣的算法:

import base64 
import hmac 
import sha 
import urllib 
h = hmac.new("OtxrzxIsfpFjA7SwPzILwy8Bw21TLhquhboDYROV", 
      "GET\n\n\n1141889120\n/quotes/nelson", 
      sha) 
urllib.quote_plus(base64.encodestring(h.digest()).strip()) 

這應該產生的結果是:

vjbyPxybdZaNmGa%2ByT272YEAiv4%3D 

我試過幾個變化,不同的字符集和不同的語言,我不能產生這個散列。我甚至下載了一些樣本,當我使用他們的簽名算法時,他們仍然不會產生這個散列。下面是C#代碼,我有:

byte[] bytesToSign = Encoding.UTF8.GetBytes("GET\n\n\n1141889120\n/quotes/nelson"); 
    byte[] secretKeyBytes = Encoding.UTF8.GetBytes("OtxrzxIsfpFjA7SwPzILwy8Bw21TLhquhboDYROV"); 
    HMAC hmacSha256 = new HMACSHA256(secretKeyBytes); 
    byte[] hashBytes = hmacSha256.ComputeHash(bytesToSign); 
    string signature = Convert.ToBase64String(hashBytes); 

,但它產生的價值:

a5n2tpQTlqetX6Pjvv7vK23qi2JIZVlWZqIdteD2pok= 

是的,我可以看到他們與一個URL編碼器包裝,但也不會改變其本急劇下降。有沒有人知道他們可能用什麼算法來產生這個散列?我沒有想法。

回答

2

您的C#代碼使用錯誤的HMAC哈希算法。從亞馬遜的文檔:

「散列函數計算簽名是 RFC 2104(http://www.ietf.org/rfc/rfc2104.txt),用你的祕密 訪問定義HMAC-SHA1關鍵是關鍵。「

,因爲它說,你需要使用SHA-1而不是SHA-256:

var bytesToSign = Encoding.UTF8.GetBytes("GET\n\n\n1141889120\n/quotes/nelson"); 
var secretKeyBytes = 
    Encoding.UTF8.GetBytes("OtxrzxIsfpFjA7SwPzILwy8Bw21TLhquhboDYROV"); 
var hmacSha1 = new HMACSHA1(secretKeyBytes); 
var hashBytes = hmacSha256.ComputeHash(bytesToSign); 
var signature = Convert.ToBase64String(hashBytes); 
+1

唉。謝謝。我正在使用HMAC-SHA256,原因是:「您可以在簽名請求時使用HMAC-SHA256(我們更喜歡HMAC-SHA256,但我們仍然支持HMAC-SHA1)」:http://aws.amazon.com/文章/ 1928 –

+0

它無法工作的原因在同一文檔中:您必須將SignatureMethod請求參數設置爲HmacSHA256或HmacSHA1,以指示您正在使用哪種簽名方法。您必須將SignatureVersion請求參數設置爲2 –