You need to enable JavaScript to run this app.
导航

签名过程Demo

最近更新时间2024.01.15 12:12:54

首次发布时间2021.02.25 21:02:47

签名自动生成

推荐使用API Explorer的签名自动生成功能,只需输入ak、sk、服务地址等信息,将会自动生成请求签名和可执行的curl命令,分步骤展示签名的生成过程。

说明

  • 签名串生成工具不会对输入AK、SK、host做准确性校验,请务必确保信息准确,否则生成的签名串将无法正常使用。
  • 密钥为敏感信息,请勿泄露相关数据。

alt

签名Demo说明

以下提供了签名过程的伪代码示例,方便您了解签名的计算过程。我们推荐您使用火山引擎SDKAPI Explorer来进行签名及API调用。若您仍需自行编码计算签名,我们还提供了具体语言的签名代码供您参考。

示例中使用的Access Key如下:
Access Key ID:
AKLTMjI2ODVlYzI3ZGY1NGU4ZjhjYWRjMTlmNTM5OTZkYzE
Secret Access Key:
TnpCak5XWXpZV1U0WkRaaE5ERmxaR0ZpTmpjeVkyUXlZek0wTWpJMU1qWQ==

原始请求为:

GET https://iam.volcengineapi.com/?Action=ListUsers&Version=2018-01-01&Limit=10&Offset=0 HTTP/1.1
Host: iam.volcengineapi.com
Content-Type: application/x-www-form-urlencoded; charset=utf-8
X-Content-Sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
X-Date:20201230T081805Z

签名过程如下:

步骤1:创建规范请求

规范请求如下

CanonicalRequest = HTTPRequestMethod + '\n' + CanonicalURI + '\n' + CanonicalQueryString + '\n' + CanonicalHeaders + '\n' + SignedHeaders + '\n' + HexEncode(Hash(RequestPayload))

HTTPRequestMethod

GET

CanonicalURI

/

CanonicalQueryString

Action=ListUsers&Limit=10&Offset=0&Version=2018-01-01

CanonicalHeaders

将需要参与签名的header的key全部转成小写, 然后以ASCII排序后以key-value的方式组合后换行构建。注意需要在结尾增加一个回车换行\n

content-type:application/x-www-form-urlencoded; charset=utf-8
host:iam.volcengineapi.com
x-content-sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
x-date:20201230T081805Z
			

SignedHeaders

content-type;host;x-content-sha256;x-date

HexEncode(Hash(RequestPayload))

无论是GET请求还是POST请求都有 RequestPayload ,其中本次GET请求中的RequestPayload是空字符串。

这里的hash算法代指: sha 256 []byte

e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

最终CanonicalRequest

GET
/
Action=ListUsers&Limit=10&Offset=0&Version=2018-01-01
content-type:application/x-www-form-urlencoded; charset=utf-8
host:iam.volcengineapi.com
x-content-sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
x-date:20201230T081805Z

content-type;host;x-content-sha256;x-date
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

步骤2:创建待签字符串

StringToSign = Algorithm + '\n' + RequestDate + '\n' + CredentialScope + '\n' + HexEncode(Hash(CanonicalRequest))

Algorithm

目前是一个固定的字符串

HMAC-SHA256

RequestDate

请求发起的时间, 与X-Date相同。

20201230T081805Z

CredentialScope

指代信任状,格式为:${YYYYMMDD}/${region}/${service}/request,其中${YYYYMMDD}取X-Date中的日期,${region}${service} 参考公共参数的Region及Service取值,request为固定值。

此请求信息如下:

20201230/cn-north-1/iam/request

HexEncode(Hash(CanonicalRequest))

3a4d4dee07c3308a52da01bc12d7a83c3705bfa543f51648f46de880bb2a7447

最终StringToSign

HMAC-SHA256
20201230T081805Z
20201230/cn-north-1/iam/request
3a4d4dee07c3308a52da01bc12d7a83c3705bfa543f51648f46de880bb2a7447

步骤3:构建签名

HMAC这里代指HMAC-SHA256

Signingkey示例

HMAC(HMAC(HMAC(HMAC(kSecret,"20201230"),"cn-north-1"),"iam"),"request")

以下示例显示了此 HMAC 哈希操作序列生成的派生签名密钥。这说明了此二进制签名密钥中每个字节的十六进制表示形式。

e7d2eb478084eaaaf8f85c161de16f13d97e52e77bd0415f33e7feb561cccffd

Signature示例

signature = HexEncode(HMAC(Signingkey, StringToSign))

最终的结果如下:

28eeabbbd726b87002e0fe58ad8c1c768e619b06e2646f35b6ad7ed029a6d8a7

步骤4:将签名添加到请求当中

在请求中增加Authorization的header如下:

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

完整结果如下:

HMAC-SHA256 Credential=AKLTMjI2ODVlYzI3ZGY1NGU4ZjhjYWRjMTlmNTM5OTZkYzE/20201230/cn-north-1/iam/request, SignedHeaders=content-type;host;x-content-sha256;x-date, Signature=28eeabbbd726b87002e0fe58ad8c1c768e619b06e2646f35b6ad7ed029a6d8a7