更新时间:2025-08-18 15:49:24
您可以在HTTP请求中包含 Authorization 头,用于携带签名信息,并表明请求者已获授权。
在头部中,签名被携带在HTTP消息的Authorization头部。Authorization的格式如下:
Authorization:WOS-HMAC-SHA256
Credential=<AccessKeyId >/<Date>/<Region>/<Service>/wos_request,
SignedHeaders=<SignedHeader>;<SignedHeader>;<SignedHeader>,
Signature=<Signature>
注意:该示例中的换行仅为便于阅读,实际需连续书写。
Authorization 参数说明
| 参数 | 说明 |
|---|---|
| WOS-HMAC-SHA256 | 固定值。用于计算签名的算法,签名算法为HMAC-SHA256。 |
| Credential | 您的访问密钥ID及包含日期、区域、服务的范围信息,用于计算签名。 该字符串格式如下: <AccessKeyId>/<Date>/<Region>/<Service>/wos_request其中: <AccessKeyId>:密钥ID。<Date>:日期格式为YYYYMMDD。<Region>:区域名称,例如 cn-south-1。<Service>:服务类型,固定为“wos”。 |
| SignedHeaders | 参与计算Signature的请求头的名称,用分号分隔,仅包括头名称,且均为小写。例如:host;range;x-wos-date |
| Signature | 256位签名,使用64位小写十六进制字符表示。例如:0243fe336dc075f95add64c5fe980ae6fd0446b243e0f301e4ad75d32d96dc6a |
计算签名一般通过以下步骤实现:
1. 创建规范化请求(Canonical Request): 将请求内容(host、操作、头信息等)整理成标准(规范化)的格式。规范化请求是生成待签名字符串的输入之一。
2. 创建待签名字符串(String To Sign): 使用规范化请求及算法、请求日期、认证范围、规范化请求的摘要(hash)等附加信息共同生成待签名字符串。
3. 计算签名: 此步骤需要根据您的密钥进行一系列带密钥的hash运算(HMAC运算),对请求日期、区域、服务等做处理,最初的哈希密钥为您的密钥。
获得签名密钥后,用此密钥对待签名字符串进行HMAC运算,得到最终签名。
在签名流程开始时,您需要将请求中的相关信息进行规范化处理,生成一个标准格式的字符串。这样可以保证OS收到请求时也能生成和您本地相同的签名。
为了让签名匹配,您必须按如下格式创建规范化请求(Canonical Request)字符串:
<HTTPMethod> + "\n" +
<CanonicalURI> + "\n" +
<CanonicalQueryString> + "\n" +
<CanonicalHeaders> + "\n" +
<SignedHeaders> + "\n" +
<HashedPayload>
在规范化请求中:
| 字段 | 说明 |
|---|---|
| HTTPMethod | 请求方法,如GET、PUT、HEAD、DELETE等 |
| CanonicalURI | URI的绝对路径部分的URI编码(从“/”开始,直到字符串结束或出现问号“?”为止)。 例如: http://Bucket.Endpoint/myphoto.jpg的绝对路径为/myphoto.jpg。 |
| CanonicalQueryString | URI编码的查询参数字符串。 1. 例如,请求url: http://Bucket.Endpoint?prefix=somePrefix&marker=someMarker&max-keys=20,CanonicalQueryString为:UriEncode("marker") + "=" + UriEncode("someMarker") + "&" + UriEncode("max-keys") + "=" + UriEncode("20") + "&" + UriEncode("prefix") + "=" + UriEncode("somePrefix")2. 如果请求子资源,参数值为空字符串""。例如,子资源acl的请求: http://Bucket.Endpoint?aclCanonicalQueryString为 UriEncode("acl") + "=" + ""3. 若URI无’?’,请求中不含查询字符串,则应设为"",但仍需写入换行符"\n"。 |
| CanonicalHeaders | 请求头列表及其取值。各头名称和值以换行符("\n")分隔,头名称必须小写并按字母升序排列。 CanonicalHeaders必须包含: 1. HTTP的host头 2. 若有Content-Type头,也必须加到CanonicalHeaders里 3. 所有您在请求中计划添加的x-wos-*头也必须加入 示例: host:bucket.endPoint,x-wos-content-sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b785,x-wos-date:20170524T000000Z注意: 1. x-wos-content-sha256为必签名头,为请求负载的哈希值(无payload则对空字符串取hash)。 2. 为避免数据篡改,建议所有请求头都包含在签名计算中。 |
| SignedHeaders | 以字母升序排列的小写请求头名称列表,用分号分隔,必须与CanonicalHeaders中一致。 上例中即: host;x-wos-content-sha256;x-wos-date |
| HashedPayload | 请求负载内容的SHA256哈希值(十六进制)。若无payload,则为对空字符串取SHA256,结果为:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855如PUT上传时,需对对象内容体计算,GET下载时计算空字符串的哈希值。 |
待签名字符串(StringToSign)包含了请求的元信息及在任务1:创建规范化请求中生成的规范请求信息。后续用于任务3:计算签名时,与派生的签名密钥结合使用,以计算请求签名。
待签名字符串由下列内容拼接而成:
"WOS-HMAC-SHA256" + "\n" +
TimeStamp + "\n" +
<Scope> + "\n" +
Hex(SHA256Hash(<Canonical Request>))
说明:
WOS-HMAC-SHA256为固定值,表示使用的hash算法HMAC-SHA256;TimeStamp为当前时间的ISO8601格式,yyyyMMdd’T’HHmmss’Z’。该值与步骤如x-wos-date保持一致。Scope限定签名在某一日期和服务区域内有效。例如:20170606/cn-east-1/wos/wos_request,20170606表示签名有效期开始,cn-east-1为区域名。Hex(SHA256Hash(<Canonical Request>))为规范化请求的SHA256哈希值(十六进制),末尾无换行。
在计算签名前,需通过您的密钥先推导出签名密钥。由于签名密钥绑定了日期、服务和区域,提高了安全性。之后,用此签名密钥和任务2:待签名字符串作为输入计算签名。
1. 计算SigningKey
签名密钥(SigningKey)需依次进行下述运算,每一步的结果作为下一步的输入,最终结果即签名密钥:
1. DateKey = HMAC-SHA256("WOS"+"<SecretKey>", "<Date>")
2. DateRegionKey = HMAC-SHA256(<DateKey>, "<Region>")
3. DateRegionServiceKey = HMAC-SHA256(<DateRegionKey>, "wos")
4. SigningKey = HMAC-SHA256(<DateRegionServiceKey>, "wos_request")
HMAC-SHA256(key, data)表示返回二进制格式的HMAC-SHA256函数,<SecretKey>为您的密钥,<Region>为存储空间(bucket)的区域名。
示例输入
SigningKey = HMAC-SHA256(HMAC-SHA256(HMAC-SHA256(HMAC-SHA256("WOS" + "EfxET06Dvb2cahG8OBtZH9WRqkB3EXAMPLEKEY","20201103"),"cn-south-1"),"wos"),"wos_request")
该例表示您于2020年11月03日在cn-south-1区域向OS发送请求。
2. 计算Signature
最终签名(Signature)是用签名密钥(SigningKey)对待签名字符串(StringToSign)做HMAC-SHA256哈希,计算方式如下:
signature = HMAC-SHA256(SigningKey, StringToSign)
注意:请确保在所使用的编程语言中,HMAC函数参数顺序填写正确。此示例以key为第一个参数,data为第二个参数,部分语言可能相反。