鉴权方式

更新时间:2023-08-17 17:36:35

本章介绍API接口的鉴权签名方式。

在Header中包含签名

在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进制字符表示

计算Signature

计算的流程和步骤说明如下:

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中的和wos_request组合而成的字符串。例如:
20170606/cn-east-1/wos/wos_request
4、Hex(SHA256Hash())是第一步中得到的CanonicalRequest的hash值。

第三步 计算SigningKey
使用SecretKey和Credential中的和wos_request经过HMAC-SHA256计算得出SigningKey,计算方式如下:

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)
  • 示例1 DeleteObject

示例中使用的数据如下:

  • AccessKeyId: 2cd1baf7681435ce4a298e9df3eb36958e725394
  • SecretKey: 968d43bc594af8622923d0681ddc367b35a8b23b
  • 请求时间戳:20201103T104419Z
  • 空间名是:wcstest-r9-private
  • 存储区域:cn-south-1

假设从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
  • 示例2 GetAvinfo
    示例中使用的数据如下:
  • AccessKeyId: AKLTAIHGXsvVYxTEXAMPLE
  • SecretKey: EfxET06Dvb2cahG8OBtZH9WRqkB3EXAMPLEKEY
  • 请求时间戳:20201103T104419Z
  • 空间名是:wsmooc
  • 存储区域:cn-east-2

假设从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中包含签名

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的计算方法

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位)。
本篇文档内容对您是否有帮助?
有帮助
我要反馈
提交成功!非常感谢您的反馈,我们会继续努力做到更好!