我目前正在实现一个生成Amazon签名版本4签名的应用程序(有关签名过程的详细信息,请参阅以下页面:http://docs.aws.amazon.com/general/latest/gr/sigv4-create-canonical-request.html)。方便的是,Amazon还为这些签名提供了测试套件。然而,有一个测试案例,我无法真正弄清楚。请注意,我的问题仅涉及签名过程的第一步(生成规范请求),特别是创建规范查询字符串。
测试用例输入HTTP请求如下所示:
POST /?@#$%^&+=/,?><`";:\|][{} =@#$%^&+=/,?><`";:\|][{} http/1.1
Date:Mon, 09 Sep 2011 23:36:00 GMT
Host:host.foo.com这是规范请求的预期结果:
POST
/
%20=%2F%2C%3F%3E%3C%60%22%3B%3A%5C%7C%5D%5B%7B%7D&%40%23%24%25%5E=
date:Mon, 09 Sep 2011 23:36:00 GMT
host:host.foo.com
date;host
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855规范请求中的第三行表示url编码的查询字符串。但是,即使遵循Sig V4文档中所述的规则,我也不太明白它们是如何从输入中获得的:
若要构造规范查询字符串,请完成以下步骤:
URI-根据以下规则编码每个参数名称和值:
不要对RFC 3986定义的任何未保留字符进行URL编码:
A-Z,a-z,0-9,连字符(- ),下划线(_ ),句点(.)),和倾斜(~ )。%-用%XY编码所有其他字符,其中X和Y是十六进制字符(0-9和大写A-F)。
例如,空格字符必须编码为%20 (不像某些编码方案那样使用'+‘),扩展的UTF-8字符必须是%XY%ZA%BC格式。
根据字符代码(即严格的ASCII顺序)对编码的参数名称进行排序。例如,以大写字母F (ASCII代码70)开头的参数名先于以小写字母b (ASCII代码98)开头的参数名称。
通过从排序列表中的第一个参数名称开始构建规范查询字符串。
对于每个参数,追加URI编码的参数名称,后面跟着字符'=‘(ASCII代码61),然后是URI编码的参数值。对没有值的参数使用空字符串。
在每个参数值之后追加字符'&‘(ASCII代码38),但列表中的最后一个值除外。
有人能解释一下吗?提前谢谢一堆人!
发布于 2015-05-06 13:21:22
我想我可能已经搞清楚了。将查询字符串@#$%^&+=/,?><``";:\|][{} =@#$%^&+=/,?><``";:\|][{}分解为键/值对(按外观顺序排列):
@#$%^,值为None+,值/,?><``";:\|][{}@#$%^,值为None+,值/,?><``";:\|][{}基于https://stackoverflow.com/a/1746566/3108853,没有关于如何处理重复键的标准,因此看起来亚马逊只是选择忽略或覆盖(这个测试用例无法判断,因为重复键的值是相同的)。
最后,考虑到第二次出现=之前的@#$%^,我认为它被解析为具有null键值的键/值对,因此它将全部删除。
https://stackoverflow.com/questions/30076788
复制相似问题