更新时间:2022.12.07 11:37:31
为了保证请求者身份的合法性以及请求在传输过程中不被恶意篡改,火山引擎签名机制要求请求者对请求参数进行哈希值计算,经过加密后同API请求一起发送到服务器中,服务器将以同样的机制对收到的请求进行签名计算,并以此与请求者传来的签名进行比对,若签名未通过验证,请求将被拒绝。
完成实名认证。
开通需要使用的产品服务。
前往产品文档中查看接口文档。
在签名之前,首先要将请求正规化,目的是让签名计算过程无异议,其主要过程及伪代码如下:
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都为"/"。如果是复杂的path,请通过RFC3986规范进行编码。 |
CanonicalQueryString | 指代正规化后的Query String。对于Query String的正规化大致的过程如下:
|
CanonicalHeaders | 指代正规化后的Header。其中伪代码如下:
特别注意:最后需要添加"\n"的换行符,header的顺序是以headerName的小写后ascii排序。 |
SignedHeaders | 指参与签名的header,和CanonicalHeaders包含的header是一一对应的,目的是指明哪些header参与签名计算,从而忽略请求被proxy添加的额外header,其中host、x-date如果存在header中则必选参与,伪代码如下: |
RequestPayload | 指代完整的请求的body。 |
签名字符串主要包含请求以及正规化请求的元数据信息,由签名算法、请求日期、信任状和正规化请求哈希值连接组成,伪代码如下:
StringToSign = Algorithm + '\n' + RequestDate + '\n' + CredentialScope + '\n' + HexEncode(Hash(CanonicalRequest))
涉及到的字段如下:
字段 | 解释 |
---|---|
Algorithm | 指代签名的算法,目前火山引擎仅支持HMAC-SHA256的签名算法。 |
RequestDate | 指代请求UTC时间,即请求头公共参数中X-Date的取值,请使用格式:YYYYMMDD'T'HHMMSS'Z' ,例如:20201103T104027Z |
CredentialScope | 指代信任状,格式为: YYYYMMDD/region/service/request |
CanonicalRequest | 指代上一小节正规化请求的结果。 |
在计算签名前,首先从私有访问密钥(AccessKey Secret)派生出签名密钥(signing key),而不是直接使用私有访问密钥。具体计算过程如下:
kSecret = *Your AccessKey Secret* kDate = HMAC(kSecret, Date) kRegion = HMAC(kDate, Region) kService = HMAC(kRegion, Service) kSigning = HMAC(kService, "request")
其中Date精确到日,与RequestDate中YYYYMMDD部分相同。
Signature = HexEncode(HMAC(kSigning, StringToSign))
然后构建header:
Authorization: HMAC-SHA256 Credential={CredentialScope}, SignedHeaders={SignedHeaders}, Signature={Signature}
表达式中用{}括起来的代表上文计算出的中间过程。