# 簽名機制
## 簽名流程
### 步驟 1. 構造規范化請求字符串
1. 排序參數。排序規則以首字母順序排序,排序參數包括 公共請求參數 和接口自定義參數,不包括公共請求參數中的 Signature 參數。
> 注意:當使用 GET 方法提交請求時,這些參數就是請求 URL 中的參數部分。即 URL 中 ? 之后由 & 連接的部分。
2. 編碼參數。使用 UTF-8 字符集按照 RFC3986 規則編碼請求參數和參數取值,編碼規則如下:
* 字符 A~Z、a~z、0~9 以及字符 -、_、.、~ 不編碼。
* 其它字符編碼成 %XY 的格式,其中 XY 是字符對應 ASCII 碼的 16 進制。示例:半角雙引號(")對應 %22。
擴展的 UTF-8 字符,編碼成 %XY%ZA… 的格式。
空格( )編碼成 %20,而不是加號(+)。
該編碼方式與 application/x-www-form-urlencoded MIME 格式編碼算法相似,但又有所不同。
如果您使用的是 Java 標準庫中的 java.net.URLEncoder,可以先用標準庫中 percentEncode 編碼,隨后將編碼后的字符中加號(+)替換為 %20、星號(*)替換為 %2A、%7E 替換為波浪號(~),即可得到上述規則描述的編碼字符串。
~~~
private static final String ENCODING = "UTF-8";
private static String percentEncode(String value) throws UnsupportedEncodingException {
return value != null ? URLEncoder.encode(value, ENCODING).replace("+", "%20").replace("*", "%2A").replace("%7E", "~") : null;
}
~~~
3. 使用等號(=)連接編碼后的請求參數和參數取值。
4. 使用與號(&)連接編碼后的請求參數,注意參數排序與 步驟 1 一致。
現在,您得到了規范化請求字符串(CanonicalizedQueryString),其結構遵循 請求結構。
### 步驟 2. 構造簽名字符串
1. 構造待簽名字符串 signature。您可以同樣使用 percentEncode 處理上一步構造的規范化請求字符串,規則如下:
~~~
signature=
HTTPMethod + "&" + //HTTPMethod:發送請求的 HTTP 方法,例如 GET。
percentEncode("/") + "&" + //percentEncode("/"):字符(/)UTF-8 編碼得到的值,即 %2F。
percentEncode(CanonicalizedQueryString) //您的規范化請求字符串。
~~~
2. 按照 RFC2104 的定義,計算待簽名字符串 StringToSign 的 HMAC-SHA1 值。示例使用的是 Java Base64 編碼方法。
`signature= Base64( HMAC-SHA1( AccessSecret, UTF-8-Encoding-Of(StringToSign) ) )`
*注意:計算簽名時,RFC2104 規定的 Key 值是您的 AccessKeySecret 并加上與號(&),其 ASCII 值為 38。更多詳情,請參閱 創建AccessKey。*
3. 添加根據 RFC3986 規則編碼后的參數 Signature 到規范化請求字符串 URL 中。