SimpleDB-HMAC签名

SimpleDB-HMAC签名,c,amazon-simpledb,C,Amazon Simpledb,我正在编写一个基本的客户端来访问AmazonSimpleDB服务,在理解请求签名背后的逻辑时遇到了一些问题 以下是一个请求示例: https://sdb.amazonaws.com/?Action=PutAttributes &DomainName=MyDomain &ItemName=Item123 &Attribute.1.Name=Color&Attribute.1.Value=Blue &Attribute.2.Name=Size&Attr

我正在编写一个基本的客户端来访问AmazonSimpleDB服务,在理解请求签名背后的逻辑时遇到了一些问题

以下是一个请求示例:

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.
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
&属性.3.名称=价格和属性.3.值=0014.99
&版本=2009-04-15
&时间戳=2010-01-25T15%3A01%3A28-07%3A00
&SignatureReversion=2
&SignatureMethod=HmacSHA256
&AWSAccessKeyId=
下面是要签名的字符串。
要签名的消息:

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
GET\n
sdb.amazonaws.com\n
/\n
AWSAccessKeyId=
&Action=puttributes
&属性1.名称=颜色
&属性1.值=蓝色
&属性2.名称=大小
&属性2.值=Med
&属性3.名称=价格
&属性3.值=0014.99
&DomainName=MyDomain
&ItemName=Item123
&SignatureMethod=HmacSHA256
&SignatureReversion=2
&时间戳=2010-01-25T15%3A01%3A28-07%3A00
&版本=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>
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
&属性.3.名称=价格和属性.3.值=0014.99
&版本=2009-04-15
&时间戳=2010-01-25T15%3A01%3A28-07%3A00
&签名=
&SignatureReversion=2
&SignatureMethod=HmacSHA256
&AWSAccessKeyId=
我没有得到要签名的信息。为什么我不明白?那么,参数顺序 请求和要签名的消息之间的所有更改。在本例中,参数可能按字母顺序排列


是否有人使用SimpleDB来告诉我要签名的消息背后的逻辑,即参数顺序等。这里的文档不是很具体。

来回答我自己的问题

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


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

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

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

  • 这些未保留的字符是A-Z、A-Z、0-9、连字符(-)、下划线(u)、句点(.)和波浪号(~)

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

  • 以%XY%ZA的形式对扩展UTF-8字符进行编码的百分比

  • 将空格字符编码为%20的百分比(而不是普通编码方案中的+)


常见错误包括对星号字符(*)编码失败,星号字符(*)可能出现在数据值和SelectExpressions中。

您也可以查看AWS SDK注意,流行的在线URL编码器也不会对星号进行编码:。例如,请参见:meyerweb.com/eric/tools/dencoder和url-encode-decode.com。