2015-05-06 45 views
1

我目前正在實施應用程序以生成Amazon AWS簽名版本4簽名(有關簽名過程的詳細信息,請參閱此頁:http://docs.aws.amazon.com/general/latest/gr/sigv4-create-canonical-request.html)。 方便的是,亞馬遜還爲這些簽名提供測試套件。然而,有一個測試用例我無法弄清楚。 請注意,我的問題僅涉及簽名過程的第一步(生成規範請求),特別是創建規範查詢字符串。根據Amazon AWS規範的URL編碼的查詢字符串

測試用例輸入HTTP請求看起來像這樣:

POST /[email protected]#$%^&+=/,?><`";:\|][{} [email protected]#$%^&+=/,?><`";:\|][{} 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-編碼查詢字符串。但我真的不明白他們是如何從輸入到那裏,連繼西格V4文檔中所述的規則:

爲構建規範的查詢字符串,請完成以下步驟:

URI編碼每根據以下規則參數名稱和值:

不要URL編碼任何未預留字符RFC 3986定義的:

包括AZ,az,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)。

有人可以解釋一下嗎? 預先感謝一堆!

回答

0

我想我可能已經知道了。分解查詢字符串@#$%^&+=/,?><``";:\|][{} [email protected]#$%^&+=/,?><``";:\|][{}成鍵/值對(按出現的順序):

  1. 密鑰@#$%^,價值
  2. 密鑰+,價值/,?><``";:\|][{}
  3. 密鑰@#$%^,價值
  4. 密鑰+,值/,?><``";:\|][{}

基於https://stackoverflow.com/a/1746566/3108853,關於如何處理重複鍵沒有標準,所以它看起來像亞馬遜只是選擇忽略或覆蓋(不可能用這個測試用例來說明,因爲重複鍵的值是一樣)。

最後,佔=@#$%^第二次出現之前,我相信它解析爲一個鍵/值對與null鍵值,所以它是被丟棄在一起。

+0

就是這樣!真的,非常感謝。現在所有的數字。只是一個小小的更正:由於查詢字符串中間的空間,第三個和第四個鍵被丟棄。也許你可以編輯上面的內容?儘管如此,我會將此標記爲正確答案:) – Zasha