更新时间:2022-05-24 18:28:09
本章介绍API接口的鉴权签名方式。
在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 | 固定格式: <AccessKeyId>/<Date>/<Region>/<Service>/wos_request <AccessKeyId>:签名所需的秘钥 <Date>:使用YYYYMMDD的格式,必须和头部Date或x-wos-date指定的日期相同 <Region>:请求资源所在的区域名(即S3区域名) <Service>:请求的服务,使用对象存储服务,该值为wos wos_request:固定值 |
SignedHeaders | 列出用于计算Signature的所有头部名称,均使用小写字母,多个按照字典序从小到大进行排序,以英文分号分隔。 例如,host;range;x-wos-date |
Signature | 256位的签名,以64个小写的16进制字符表示 |
计算的流程和步骤说明如下:
1、Canonical Request
HTTP Veb + "\n" + // GET、HEAD、PUT、POST、DELETE ...
Canonical URI + "\n" + // UriEncode(<uri>)
Canonical Query String + "\n" + // UriEncode(<queryParam1>)+"="+UriEncode(<value1>)+"&"+...+UriEncode(<queryParamN>)+"="+UriEncode(<valueN>)
Canonical Header + "\n" + // Lowcase(<header1>)+":"+Trim(<value1>)+"\n"+...+Lowcase(<headerN>)+":"+Trim(<valueN>)
Signed Headers + "\n" + // Lowcase(<header1>)+";"+...+Lowcase(<headerN>)
Hashed Payload // Hex(SHA256Hash(payload))
2、StringToSign
"WOS-HMAC-SHA256" + "\n" +
TimeStamp + "\n" + // ISO8601格式,yyyyMMdd'T'HHmmss'Z'。必须和头部date或x-wos-date 指定的日期时间相同。
<Scope> + "\n" + // <Date>/<Region>/<Service>/wos/<request>组合而成, 例如:20170606/cn-east-1/wos/wos_request
Hex(SHA256Hash(<Canonical Request>))
3、Signature
DateKey = HMAC-SHA256("WOS"+"<SecretKey>", "<Date>")
DateRegionKey = HMAC-SHA256(<DateKey>, "<Region>")
DateRegionServiceKey = HMAC-SHA256(<DateRegionKey>, "<Service>")
SigningKey = HMAC-SHA256(<DateRegionServiceKey>, "wos_request")
signature = Hex(HMAC-SHA256(SigningKey, StringToSign))
流程中使用的函数说明如下表:
函数名称 | 描述 |
---|---|
Lowercase() | 将字符串转换为小写字母 |
Hex() | 基于小写字母的16进制编码 |
SHA256Hash() | 通过SHA256加密的哈希函数 |
HMAC-SHA256() | 使用SigningKey通过SHA256算法计算HMAC |
Trim() | 去除首尾的空格 |
UriEncode() | URI编码每个字节 |
第一步 创建CanonicalRequest
CanonicalRequest用于计算Signature,为了Signature能正确匹配,创建CanonicalRequest须遵循如下格式:
<HTTPMethod> + "\n" +
<CanonicalURI> + "\n" +
<CanonicalQueryString> + "\n" +
<CanonicalHeaders> + "\n" +
<SignedHeaders> + "\n" +
<HashedPayload>
Canonical Request组成字段如下表所示:
字段名称 | 描述 |
---|---|
HTTPMethod | TTP请求方法之一,如GET,POST,PUT,DELETE等 |
CanonicalURI | URI的绝对路径,需经过UriEncode。如果有带查询字符串参数,则是域名后以"/“开始到”?"前所有的部分。 例如http://Bucket.Endpoint/myphoto.jpg的绝对路径为/myphoto.jpg。 |
CanonicalQueryString | 查询字符串参数,需要分别将name和values进行UriEncode,并按字母顺序排列。 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?acl CanonicalQueryString值为:UriEncode(“acl”) + “=” + ““ 3、如果请求没带查询字符串,则CanonicalQueryString值为空字符串””,在CanonicalRequest用"\n"表示CanonicalQueryString。 |
CanonicalHeaders | 列出请求头部及对应的值,头部的名称和值用":“连接,头部的名称必须用小写表示,并按字母顺序排列。每个头部之间用”\n"分隔。 CanonicalHeaders必须包含如下: 1、HTTP的host头部 2、如果请求中有Content-Type头部,也要列出 3、x-wos-content-sha256头部 4、请求中带的所有x-wos-*头部。 注意: 1、x-wos-content-sha256是签名计算时必带的头部,它是请求负载的hash值。如果请求没有消息体则提供空字符串的hash值。 2、为了防止数据篡改,建议在签名计算中包括所有请求头部。 例如,CanonicalHeaders值为(小写字母,字典序排列): host:bucket.endPoint,x-wos-content-sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b785,x-wos-date:20170524T000000Z |
SignedHeaders | 用来计算签名的头部的名称,用小写表示,并按字典顺序排列,多个以英文分号分隔。列出的头部必须和CanonicalHeaders中列出的头部相同 例如,上面CanonicalHeaders的例子中, SignedHeaders 应该是: host;x-wos-content-sha256;x-wos-date |
HashedPayload | 请求有效负载的sha256 hash值,用16进制表示。如果请求中没有有效负载,则计算空字符串"“的hash值,Hex(SHA256Hash(”")),计算的结果为e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 例如,当通过PUT请求上传对象时,计算对象数据的hash值;当通过GET请求获取对象时,计算空字符串的hash值 |
第二步 创建StringToSign
创建用于计算Signature的字符串,StringToSign应遵循以下格式:
"WOS-HMAC-SHA256" + "\n" +
TimeStamp + "\n" +
<Scope> + "\n" +
Hex(SHA256Hash(<Canonical Request>))
说明:
1、WOS-HMAC-SHA256是固定值,指定使用的签名算法是HMAC-SHA256;
2、TimeStamp使用 ISO8601 格式,yyyyMMdd’T’HHmmss’Z’。必须和头部date或x-wos-date 指定的日期时间相同。
3、Scope是由Credential中的
20170606/cn-east-1/wos/wos_request
4、Hex(SHA256Hash(
第三步 计算SigningKey
使用SecretKey和Credential中的
DateKey = HMAC-SHA256("WOS"+"<SecretKey>", "<Date>")
DateRegionKey = HMAC-SHA256(<DateKey>, "<Region>")
DateRegionServiceKey = HMAC-SHA256(<DateRegionKey>, "<Service>")
SigningKey = HMAC-SHA256(<DateRegionServiceKey>, "wos_request")
注意:Date的格式是YYYYMMDD,必须和头部date或x-wos-date 指定的日期相同。
第四步 计算Signature
将第三步得到的SigningKey和第二步得到的StringToSign经过HMAC-SHA256计算得出Signature,计算方式如下:
HMAC-SHA256(SigningKey, StringToSign)
示例中使用的数据如下:
假设从wcstest-r9-private删除 /mine-type.mp4 这个文件,请求如下:
DELETE /mine-type.mp4 HTTP/1.1
Host: wcstest-r9-private.s3-cn-south-1.wcsapi.com
Authorization: <Authorization>
Range:0-9
x-wos-content-sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
x-wos-date:20201103T104419Z
说明:因为下载请求不需要提供主体内容,所以x-wos-content-sha256的值是空请求主体的hash值。
计算Signature和构造Authorization头部的步骤如下:
1、CanonicalRequest
DELETE
/mine-type.mp4
host:wsmooc.avinfo.cloudv.haplat.net
x-wos-content-sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
x-wos-date:20201103T104419Z
host;x-wos-content-sha256;x-wos-date
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
注:DeleteObject请求的CanonicalQueryString为空,所以第三行为空行。
2、StringToSign
WOS-HMAC-SHA256
20201103T104419Z
20201103/cn-south-1/wos/wos_request
55f35c488a08877ce1bec27b2d852b4d242a135df3e9bc3bd60be027df455216
3、SigningKey
SingingKey = HMAC-SHA256(HMAC-SHA256(HMAC-SHA256(HMAC-SHA256("WOS" + "EfxET06Dvb2cahG8OBtZH9WRqkB3EXAMPLEKEY","20201103"),"cn-south-1"),"wos"),"wos_request")
4、Signature
0243fe336dc075f95add64c5fe980ae6fd0446b243e0f301e4ad75d32d96dc6a
5、Authorization头部
WOS-HMAC-SHA256 Credential=2cd1baf7681435ce4a298e9df3eb36958e725394/20201103/cn-south-1/wos/wos_request, SignedHeaders=host;x-wos-content-sha256;x-wos-date, Signature=0243fe336dc075f95add64c5fe980ae6fd0446b243e0f301e4ad75d32d96dc6a
假设从wsmooc获取 /video/20201029/0f3de4278bd6438eb871a6daa43c6305/5555555582qq77n8555602653pp77282_b67923f7d7b2459091621637b1808ab3.mp4 的avinfo信息,请求如下:
GET /video/20201029/0f3de4278bd6438eb871a6daa43c6305/5555555582qq77n8555602653pp77282_b67923f7d7b2459091621637b1808ab3.mp4?avinfo HTTP/1.1
Host: wsmooc.avinfo.cloudv.haplat.net
Authorization: <Authorization>
x-wos-content-sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
x-wos-date:20201103T104419Z
说明:因为下载请求不需要提供主体内容,所以x-wos-content-sha256的值是空请求主体的hash值。
计算Signature和构造Authorization头部的步骤如下:
1、CanonicalRequest
GET
/video/20201029/0f3de4278bd6438eb871a6daa43c6305/5555555582qq77n8555602653pp77282_b67923f7d7b2459091621637b1808ab3.mp4
avinfo=
host:wsmooc.avinfo.cloudv.haplat.net
x-wos-content-sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
x-wos-date:20201103T104419Z
host;x-wos-content-sha256;x-wos-date
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
2、StringToSign
WOS-HMAC-SHA256
20201103T104419Z
20201103/cn-east-2/wos/wos_request
0788dd8e9b3a088477031b2127ac05bfcf960229a636adb54cb387df1e1cb096
3、SigningKey
SingingKey = HMAC-SHA256(HMAC-SHA256(HMAC-SHA256(HMAC-SHA256("WOS" + "EfxET06Dvb2cahG8OBtZH9WRqkB3EXAMPLEKEY","20201103"),"cn-east-2"),"wos"),"wos_request")
4、Signature
335265293972c56fa6e0c4453a86c7aa32610e6a6d6809dac4e9fb64700296ed
5、Authorization头部
WOS-HMAC-SHA256 Credential=AKLTAIHGXsvVYxTEXAMPLE/20201103/cn-east-2/wos/wos_request, SignedHeaders=host;x-wos-content-sha256;x-wos-date, Signature=335265293972c56fa6e0c4453a86c7aa32610e6a6d6809dac4e9fb64700296ed
URL签名示例
http://bucketName.s3-cn-east=1.wcsapi.com/keyName?Signature=hXrFL6wBspF7fNE7lChnOIBEpE4%3D&AWSAccessKeyId=db17ab5d18c137f786b67c490187317a0738f94a&Expires=1639390003
名称 | 是否必选 | 描述 |
---|---|---|
Expires | 是 | Unix时间戳,用于指定鉴权串的超时时间。如果接收到请求的时间晚于签名中包含的Expires参数,则返回请求超时的错误码。 |
AWSAccessKeyId | 是 | 密钥中的AccessKeyId。 |
Signature | 是 | 签名信息。签名信息的格式如下: Signature = urlencode(base64(hmac-sha1(AccessKeySecret, VERB + “\n” + CONTENT-MD5 + “\n” + CONTENT-TYPE + “\n” + EXPIRES + “\n” + CanonicalizedOSSHeaders + CanonicalizedResource))) 所有支持的请求和各种Header参数,在URL中进行签名的算法和在Header中包含签名的算法基本一样。 |
Content-MD5是根据文件的MD5值计算出的校验值,可用于校验文件在传输过程中是否完整,此处以“abcdefg”为例详细说明正确计算Content-MD5的方法。
1、先计算MD5加密的二进制数组(128位)。
2、对该二进制数组进行base64编码(而不是对32位字符串编码)。
以Python为例:
import base64,hashlib
hash = hashlib.md5()
hash.update("abcdefg")
# 在Python 3中此处需要改为hash.update(b"abcdefg")。
base64.b64encode(hash.digest())
'Rh8T4+Nz/wq4ohkoOv4z2w=='
hash.digest(),计算出二进制数组(128位)。