You need to enable JavaScript to run this app.
导航
签名机制
最近更新时间:2023.04.24 11:01:04首次发布时间:2023.04.24 11:01:04

云数据库 SQL Server 版服务会对每个访问的请求进行身份验证,因此您需要在请求中包含签名信息。本文介绍云数据库 SQL Server 版的 API 签名机制。

创建一个正规化请求

在访问时需要按照下面的方法对请求进行签名处理:

CanonicalRequest = HTTPRequestMethod + '\n' + CanonicalURI + '\n' + CanonicalQueryString + '\n' + CanonicalHeaders + '\n' + SignedHeaders + '\n' + HexEncode(Hash(RequestPayload))
  • HTTPRequestMethod 指代 HTTP 请求的 method,例如:GET 、 POST 等。

  • CanonicalURI: 指代正规化后的 URI。如果 URI 为空,那么使用(/)作为绝对路径。在火山引擎中绝大多数接口的 URI 都为(/)。

  • CanonicalQueryString 指代正规化后的 Query String。例如:

    CanonicalQueryString = "Action=ListUsers&Version=2018-01-01"
    

    正规化 Query String 的大致过程如下:
    - URI 编码每一个 querystring 的参数名称和参数值。
    - 按照 ASCII 字节顺序对参数名称严格排序,相同参数名的不同参数值需保持请求的原始顺序。
    - 将排序好的参数名称和参数值用(=)连接,按照排序结果将参数对用(&)连接。

  • CanonicalHeaders 指代正规化后的 Header 。其中伪代码如下:

    CanonicalHeaders =
    CanonicalHeadersEntry0 +
    CanonicalHeadersEntry1 + ... +
    CanonicalHeadersEntryN
    
    • 其中,
      CanonicalHeadersEntry = Lowercase(HeaderName) + ':' + Trimall(HeaderValue) + '\n'
      
      • Lowcase 代表将 Header 的名称全部转化成小写。

      • Trimall 表示去掉 Header 的值的前后多余的空格。

      • 最后需要添加换行符\n

  • SignedHeaders 指代参与签名的 Header 名称。签名 Header 是包含在正规化 Headers 中名称列表,其目的是指明哪些 Header 参与签名计算,从而忽略请求被 proxy 添加的额外 Header ,其中 host、x-date 两个 Header 如果存在则必须添加进来,伪代码如下:

    SignedHeaders = Lowercase(HeaderName0) + ';' + Lowercase(HeaderName1) + ";" + ... + Lowercase(HeaderNameN)
    
  • RequestPayload 指代完整的请求的 body 。需要注意如下几点:

    • URI 编码(注:同 RFC3986 方法)每一个 querystring 的参数名称和参数值。

    注意

    GET 方式需要包含哈希算法、信任状、签名日期和签名 header 等全部参数)。

    • 按照 ASCII 字节顺序对参数名称严格排序。

    • 将排序好的参数名称和参数值用(=)连接,按照排序结果将参数对用(&)连接。

  • Hash 代指 SHA256 算法。

  • HexEncode 代指转 16 进制编码。

创建签名字符串

签名字符串主要包含请求以及正规化请求的元数据信息,由签名算法、请求日期、信任状和正规化请求哈希值连接组成,伪代码如下:

StringToSign = Algorithm + '\n' + RequestDate + '\n' + CredentialScope + '\n' + HexEncode(Hash(CanonicalRequest))
  • Algorithm 指代签名的算法,目前火山引擎仅支持 HMAC-SHA256 的签名算法。

  • RequestDate 指代请求 UTC 时间,请使用如下格式: YYYYMMDD'T'HHMMSS'Z'。

  • CredentialScope 指代信任状,格式为: YYYYMMDD/region/ service/request

  • CanonicalRequest 指代上一小节正规化请求的结果。

计算签名秘钥( signing-key )

在计算签名前,首先从私有访问密钥(secret AccessKey)派生出签名密钥(signing key),而不是直接使用私有访问密钥。具体计算过程如下:

kSecret = Your Secret Access Key
kDate = HMAC(kSecret, Date)
kRegion = HMAC(kDate, Region)
kService = HMAC(kRegion, Service)
kSigning = HMAC(kService, "request")
  1. 计算签名。

    Signature = HexEncode(HMAC(kSigning, StringToSign))
    
  2. 构建 Header。

    Authorization: HMAC-SHA256 Credential={AccessKeyId}/{CredentialScope}, SignedHeaders={SignedHeaders}, Signature={Signature}
    

    说明

    表达式中用({})括起来的内容代表上文计算出的中间过程。

签名示例

更多详情,请参见签名示例