全部產品
Search
文件中心

PolarDB:簽名機制

更新時間:Jul 06, 2024

為保證API的安全調用,在調用API時阿里雲會對每個API請求通過簽名(Signature)進行身分識別驗證。無論使用HTTP還是HTTPS協議提交請求,都需要在請求中包含簽名資訊。

概述

RPC API要按如下格式在API請求的Query中增加簽名(Signature):

https://Endpoint/?SignatureVersion=1.0&SignatureMethod=HMAC-SHA1&Signature=CT9X0VtwR86fNWSnsc6v8YGOjuE%3D&SignatureNonce=3ee8c1b8-83d3-44af-a94f-4e0ad82fd6cf
其中:
  • SignatureMethod:簽名方式,目前支援HMAC-SHA1。
  • SignatureVersion:簽名演算法版本,目前版本是1.0。
  • SignatureNonce:唯一隨機數,用於防止網路重放攻擊。使用者在不同請求間要使用不同的隨機數值,建議使用通用唯一識別碼(Universally Unique Identifier, UUID)。
  • Signature: 使用AccessKey Secret對請求進行對稱式加密後產生的簽名。

計算簽名

簽名演算法遵循RFC 2104 HMAC-SHA1規範,使用AccessSecret對編碼、排序後的整個請求串計算HMAC值作為簽名。簽名的元素是請求自身的一些參數,由於每個API請求內容不同,所以簽名的結果也不盡相同。

Signature = Base64( HMAC-SHA1( AccessSecret, UTF-8-Encoding-Of(
StringToSign)) )
完成以下操作,計算簽名:
  1. 構建待簽名字串
    1. 使用請求參數構造正常化的請求字串(Canonicalized Query String):
      1. 按照參數名稱的字典順序對請求中所有的請求參數(包括公用請求參數和介面的自訂參數,但不包括公用請求參數中的Signature參數)進行排序。

        當使用GET方法提交請求時,這些參數就是請求URI中的參數部分,即URI中“?”之後由“&”串連的部分。

      2. 對排序之後的請求參數的名稱和值分別用UTF-8字元集進行URL編碼。編碼規則如下:
        • 對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的實現)存在區別。編碼時可以先用標準庫的方式進行編碼,然後把編碼後的字串中的加號(+)替換成 %20,星號(*)替換成 %2A%7E替換回波浪號(~),即可得到上述規則描述的編碼字串。本演算法可以用下面的percentEncode方法來實現:

          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;
          }
        • 將編碼後的參數名稱和值用英文等號(=)進行串連。
        • 將等號串連得到的參數組合按步驟 i 排好的順序依次使用“&”符號串連,即得到正常化請求字串。
    2. 將第一步構造的正常化字串按照下面的規則構造成待簽名的字串。
      StringToSign=
            HTTPMethod + “&” +
            percentEncode(“/”) + ”&” +
             percentEncode(CanonicalizedQueryString)

      其中:

      • HTTPMethod 是提交請求用的HTTP方法,比如GET。
      • percentEncode(“/”) 是按照步驟1.1中描述的 URL 編碼規則對字元 “/” 進行編碼得到的值,即 %2F。
      • percentEncode(CanonicalizedQueryString) 是對步驟1中構造的正常化請求字串按步驟 1.2 中描述的URL編碼規則編碼後得到的字串。
  2. 計算簽名
    1. 按照RFC2104的定義,計算待簽名字串(StringToSign)的HMAC值。
      說明 計算簽名時使用的Key就是您持有的AccessKey Secret並加上一個 “&” 字元(ASCII:38), 使用的雜湊演算法是SHA1。
    2. 按照Base64編碼規則把上面的HMAC值編碼成字串,即得到簽名值(Signature)。
    3. 將得到的簽名值作為Signature參數添加到請求參數中。
      說明 得到的簽名值在作為最後的請求參數值提交時要和其它參數一樣,按照RFC3986的規則進行URL編碼。

樣本

DescribeDrdsInstancesAPI 為例,假設使用的AccessKey IdtestidAccessKey Secrettestsecret。 簽名前的請求URL如下:

AccessKeyId=testid&Action=DescribeDrdsInstances&Format=XML&RegionId=cn-hangzhou&SignatureMethod=HMAC-SHA1&SignatureNonce=ae5bdbeb-9b44-40a1-8bb4-b40784bff686&SignatureVersion=1.0&Timestamp=2016-01-20T14%3A26%3A15Z&Version=2015-04-13

使用testsecret&,計算得到的簽名值是:

h/ka/jNO+WZv8Tqgo4a75sp6eTs=

最後將簽名作為Signature參數加入到URL請求中,最後得到的URL為:

http://drds.aliyuncs.com/?AccessKeyId=testid&Action=DescribeDrdsInstances&Format=XML&RegionId=cn-hangzhou&SignatureMethod=HMAC-SHA1&SignatureNonce=ae5bdbeb-9b44-40a1-8bb4-b40784bff686&SignatureVersion=1.0&Timestamp=2016-01-20T14%3A26%3A15Z&Version=2015-04-13&Signature=h%2Fka%2FjNO%2BWZv8Tqgo4a75sp6eTs%3D