全部產品
Search
文件中心

Data Lake Analytics - Deprecated:簽名方法

更新時間:Jul 06, 2024

對於每一次HTTP或者HTTPS協議請求,我們會根據訪問中的簽名資訊驗證訪問要求者身份。具體由使用AccessKeyID和AccessKeySecret對稱式加密驗證實現。

重要 使用SDK提交請求可以免去做簽名。

步驟一:構造正常化請求字串

  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-urlencodedMIME格式編碼演算法相似,但又有所不同。

      如果您使用的是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. 使用與號(&)串連編碼後的請求參數。

完成上述操作後,您就可以擷取到正常化請求字串(CanonicalizedQueryString)。

步驟二:建構簽章字串

構造待簽名字串StringToSign。您可以同樣使用percentEncode處理上一步構造的正常化請求字串,規則如下:
StringToSign=
  HTTPMethod + "&" + //HTTPMethod:發送請求的 HTTP 方法,例如 GET。
  percentEncode("/") + "&" + //percentEncode("/"):字元(/)UTF-8 編碼得到的值,即 %2F。
  percentEncode(CanonicalizedQueryString) //您的正常化請求字串。
按照RFC2104的定義,計算待簽名字串StringToSign的HMAC-SHA1值。樣本使用的是Java Base64編碼方法。
Signature = Base64( HMAC-SHA1( AccessSecret, UTF-8-Encoding-Of(StringToSign) ) )

計算簽名時,RFC2104規定的Key值是您的AccessKeySecret並加上與號(&),其ASCII值為38。將計算結果添加根據RFC3986Signature規則編碼後的參數到正常化請求字串URL中。

簽名計算過程樣本

以調用GetJobStatus查詢作業狀態為例。假設您獲得了AccessKeyID=xxx以及AccessKeySecret=yyy,簽名流程如下所示:

  1. 構造正常化請求字串,需要注意這裡有一個隨機字串 SignatureNonce
    http://openanalytics.cn-hangzhou.aliyuncs.com/?
    AccessKeyId=xxx&Action=GetJobStatus&Format=JSON&JobId=MySparkJobId&SignatureMethod=HMAC-
    SHA1&SignatureNonce=f87701c37ad49e3153fabf78ed2ad73c&SignatureVersion=1.0&Timestamp=2020-10-27T07:32:05Z&VcName=MyCluster&Version=2018-06-19
  2. 構造待簽名字串。
    GET&%2F&AccessKeyId=xxx&Action=GetJobStatus&Format=JSON&JobId=MySparkJobId&SignatureMethod=HMAC-
    SHA1&SignatureNonce=f87701c37ad49e3153fabf78ed2ad73c&SignatureVersion=1.0&Timestamp=2020-10-
    27T07%3A32%3A05Z&VcName=MyCluster&Version=2018-06-19
  3. 計算簽名值。因為AccessKeySecret=yyy,用於計算的Key為yyy&,計算得到的簽名值為DR5p4dbFur6ad****Iq8uH4sW6w=。樣本使用的是JavaBase64編碼方法。
    Signature = Base64( HMAC-SHA1( AccessSecret, UTF-8-Encoding-Of(StringToSign) ) )
  4. 添加RFC3986規則編碼後的Signature=DR5p4dbFur6ad****Iq8uH4sW6w%3D到URL中。
    http://openanalytics.cn-hangzhou.aliyuncs.com/?
    AccessKeyId=xxx&Action=GetJobStatus&Format=JSON&JobId=MySparkJobId&SignatureMethod=HMAC-
    SHA1&SignatureNonce=f87701c37ad49e3153fabf78ed2ad73c&SignatureVersion=1.0&Timestamp=2020-
    10-27T07%3A32%3A05Z&VcName=MyCluster&Version=2018-06-
    19&Signature=DR5p4dbFur6ad****Iq8uH4sW6w%3D

    通過以上URL,您可以使用瀏覽器、curl或者wget等工具發起HTTP請求調用。