代码之家  ›  专栏  ›  技术社区  ›  hookenz

SimpleDB HMAC签名

  •  2
  • hookenz  · 技术社区  · 14 年前

    我正在编写一个基本的客户机来访问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 回复  |  直到 14 年前
        1
  •  4
  •   hookenz    14 年前

    回答我自己的问题。

    答案就藏在文件里。我是对的,我要先对参数排序。

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

        2
  •  1
  •   Mocky    14 年前

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

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

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

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

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

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

    • 百分比将空格字符编码为%20(而不是+常用编码方案)。

    一个常见的错误是未能对星号字符(*)进行编码,星号字符可能同时出现在数据值和SelectExpressions中。