SimpleDB HMAC签名

时间:2010-11-29 02:51:36

标签: c amazon-simpledb

我正在编写一个基本客户端来访问Amazon SimpleDB服务,而我在理解签署请求背后的逻辑时遇到了一些麻烦。

以下是一个示例请求:

https://sdb.amazonaws.com/?Action=PutAttributes
&DomainName=MyDomain
&ItemName=Item123
&Attribute.1.Name=Color&Attribute.1.Value=Blue
&Attribute.2.Name=Size&Attribute.2.Value=Med
&Attribute.3.Name=Price&Attribute.3.Value=0014.99
&Version=2009-04-15
&Timestamp=2010-01-25T15%3A01%3A28-07%3A00
&SignatureVersion=2
&SignatureMethod=HmacSHA256
&AWSAccessKeyId=<Your AWS Access Key ID>
Following is the string to sign.

要签名的消息:

GET\n
sdb.amazonaws.com\n
/\n
AWSAccessKeyId=<Your AWS Access Key ID>
&Action=PutAttributes
&Attribute.1.Name=Color
&Attribute.1.Value=Blue
&Attribute.2.Name=Size
&Attribute.2.Value=Med
&Attribute.3.Name=Price
&Attribute.3.Value=0014.99
&DomainName=MyDomain
&ItemName=Item123
&SignatureMethod=HmacSHA256
&SignatureVersion=2
&Timestamp=2010-01-25T15%3A01%3A28-07%3A00
&Version=2009-04-15

以下是已签名的请求。

https://sdb.amazonaws.com/?Action=PutAttributes
&DomainName=MyDomain
&ItemName=Item123
&Attribute.1.Name=Color&Attribute.1.Value=Blue
&Attribute.2.Name=Size&Attribute.2.Value=Med
&Attribute.3.Name=Price&Attribute.3.Value=0014.99
&Version=2009-04-15
&Timestamp=2010-01-25T15%3A01%3A28-07%3A00
&Signature=<URLEncode(Base64Encode(Signature))>
&SignatureVersion=2
&SignatureMethod=HmacSHA256
&AWSAccessKeyId=<Your AWS Access Key ID>

我没有得到的是要签名的信息。我为什么不明白?好吧,参数顺序 在请求和要签名的消息之间都发生了变化。在示例中可能出现参数按字母顺序排序。

有没有人玩过SimpleDB,能够告诉我签名信息背后的逻辑,即参数顺序等。这里的文档不是很具体。

2 个答案:

答案 0 :(得分:4)

回答我自己的问题。

答案隐藏在文档中。我是对的,我要先对参数进行排序。

http://docs.amazonwebservices.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/index.html?Query_QueryAuth.html

答案 1 :(得分:1)

对于稍后阅读此问题的人,以下是文档相关部分的引用。此部分似乎已从SimpleDB文档中消失,但仍存在于SQS文档中。它仍然直接适用于SimpleDB。

一个关键问题是您必须对所有HTTP参数值进行正确的URL编码。

  
      
  • 不要对RFC 3986的任何非保留字符进行URL编码   定义

  •   
  • 这些未保留的字符是A-Z,a-z,0-9,连字符( - ),下划线(_),句点(。)和波浪号(〜)。

  •   
  • 百分比用%XY编码所有其他字符,其中X和Y是十六进制字符0-9和大写字母A-F。

  •   
  • 百分比编码扩展的UTF-8字符,格式为%XY%ZA

  •   
  • 百分比将空格字符编码为%20(而不是+,正如常见的编码方案那样)。

  •   

常见错误包括无法对星号字符(*)进行编码,该字符可以出现在数据值和SelectExpressions中。