2011-11-30 49 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 –