You need to enable JavaScript to run this app.
文档中心
云数据库 PostgreSQL 版

云数据库 PostgreSQL 版

复制全文
下载 pdf
调用方式
签名机制
复制全文
下载 pdf
签名机制
本文介绍调用云数据库 PostgreSQL 版 Open API 的签名机制。签名用于对请求参数进行加密处理,保证请求在传输过程中不被篡改。​
签名机制​
火山引擎手动签名机制要求请求者对请求参数进行哈希值计算,经过加密后同 API 请求一起发送到服务器中,服务器将以同样的机制对收到的请求进行签名计算,并将其与请求者传来的签名进行比对,若签名未通过验证,请求将被拒绝。​
​​​
获取访问密钥Access Key)​
访问密钥(Access Key)是请求火山引擎 OpenAPI 的安全凭证,参考 Access Key 管理获取账户的 Access Key ID 和 Secret Access Key。​
构建规范请求字符串(CanonicalRequest)​
在签名之前,首先需要将请求规范化,目的是让签名计算过程无异议。构建规范化请求字符串,具体过程及伪代码如下:​
​
CanonicalRequest = ​
HTTPRequestMethod + '\n' + ​
CanonicalURI + '\n' + ​
CanonicalQueryString + '\n' + 、​
CanonicalHeaders + '\n' + ​
SignedHeaders + '\n' + ​
HexEncode(Hash(RequestPayload))​
​
说明​
Hash 代指 SHA256 算法,HexEncode代指转 16 进制编码,HMAC指代HMAC_SHA256。​
  • 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'​
    ​
说明​
  • Lowercase 代表将 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 字节顺序对参数名称严格排序。​
  • 将排序好的参数名称和参数值用(=)连接,按照排序结果将参数对用(&)连接。​
构建待签名字符串(StringToSign)​
签名字符串主要包含请求以及正规化请求的元数据信息,由签名算法、请求日期、信任状和正规化请求哈希值连接组成,伪代码如下:​
​
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 指代上一小节正规化请求的结果。​
计算签名密钥(kSigning)​
在计算签名前,首先需使用访问密钥的 Secret Access Key 派生出签名密钥(kSigning)。 访问密钥(Access Key)是请求火山引擎 OpenAPI 的安全凭证,参考 Access Key 管理 获取账户的 Access Key ID 和 Secret Access Key。​
计算派生签名密钥,计算过程及伪代码如下:​
​
kSecret = *Your Secret Access Key*​
kDate = HMAC(kSecret, Date)​
kRegion = HMAC(kDate, Region)​
kService = HMAC(kRegion, Service)​
kSigning = HMAC(kService, "request")​
​
说明​
其中 Date 精确到日,与 RequestDate 中 YYYYMMDD 部分相同。​
计算签名(Signature)​
计算签名,伪代码如下:​
​
Signature = HexEncode(HMAC(kSigning, StringToSign))​
​
构建 Authorization​
按如下格式构建 Header 的 Authorization 参数:​
​
Authorization: HMAC-SHA256 Credential={AccessKeyId}/{CredentialScope}, SignedHeaders={SignedHeaders}, Signature={Signature}​
​
签名示例​
更多详情,请参见签名示例。​
​
最近更新时间:2025.11.17 20:44:50
这个页面对您有帮助吗?
有用
有用
无用
无用