我们已经准备好了,你呢?

2023我们与您携手共赢,为您的企业形象保驾护航!


喜讯:国内、香港、海外云服务器租用特惠活动,2核/4G/10M仅需31元每月,点击抢购>>>

点击这里注册天翼云特邀VIP帐号,立即体验天翼云对象存储>>>


天翼云对象存储(经典版)I型API参考-用户签名验证(V4)使用Authorization请求头验证


概述

Authorization请求头包含以下信息(增加换行是为了方便阅读,实际为空字符串):

Authorization: AWS4-HMAC-SHA256  Credential=2a948fd3f00ba0925806/20180501/region/s3/aws4_request,  SignedHeaders=host;range;x-amz-date,  Signature=fe5f80f77d5fa3beca038a248ff027d0445342fe2855ddc963176630326f1024

组成字段说明如下:

参数

描述

AWS4-HMAC-SHA256

用于签名的算法,固定值。

Credential

用户AccessKeyId和范围信息,范围信息包括请求日期、区域、服务、终止字符串aws4_request,格式如下:

<your-access-key-id>/<date>/<region>/<service>/aws4_request

其中:

  • date格式为YYYYMMDD。

  • region:
          * 对于oos api:访问域名为oos-xx.ctyunapi.cn,region为xx。各资源池的详细访问域名详见Endpoint列表

   * 对于统计api:访问域名为oos-xx-mg.ctyunapi.cn,region为xx,各资源池的详细访问域名详见Endpoint列表

   * 对于操作跟踪api:访问域名为oos-xx-cloudtrail.ctyunapi.cn,region为xx,各资源池的详细访问域名详见Endpoint列表

   * 对于iam api:访问域名为oos-xx-iam.ctyunapi.cn,region为xx,各资源池的详细访问域名详见Endpoint列表

  • service:

* 若使用OOS API服务,service为s3;

*  若使用统计分析服务,service为s3;

*  若使用操作跟踪服务,service为cloudtrail;

*  若使用IAM服务,service为sts。

SignedHeaders

已签名请求头的列表。该列表只需包含请求头名字,用分号分隔,必须全部小写,并按字符顺序对其进行排序,示例如下:

host;range;x-amz-date

Signature

计算出的256位签名信息,以64个小写十六进制字符串形式表示。

有两种签名计算方式:

  • 签名负载方式:用户可以选择计算整个负载(即请求体)的checksum,并将其包含在签名计算中。这种方式提高了安全性,但用户需要读取两次负载或将其缓冲在内存中。我们建议用户包含负载checksum以增强安全性。

  •  无签名负载方式:在签名计算中不包括负载的checksum。

上述两种方式,都必须携带x-amz-content-sha256请求头,如果选择签名负载方式,请将x-amz-content-sha256请求头的值设置为负载的checksum值,否则将值设置为文本字符串UNSIGNED-PAYLOAD。

签名过程

签名过程如下图所示:

下表描述了图中显示的功能。用户需要为这些函数实现代码。

功能

描述

Lowercase()

将字符串转换为小写。

Hex()

小写16进制编码。

SHA256Hash()

安全散列算法(SHA)加密散列函数。

HMAC-SHA256()

使用签名密钥,根据SHA256算法计算出的签名值。

Trim()

删除任何前导或尾随空格。

UriEncode()

URI编码每个字节。UriEncode()必须强制执行以下规则:

  •  除下列字符外,其他字符进行URI编码:'A' - 'Z','a' - 'z','0' - '9',' - ','.','_'和'〜'。

  • 空格字符是保留字符,必须编码为“%20”(而不是“+”)。

  •  每个URI编码字节由'%'和两位十六进制值组成。

  • 十六进制值中的字母必须为大写,例如“%1A”。

  •  除了对象名之外,对正斜杠字符'/'进行编码。例如,如果对象名称为 photos/Jan/sample.jpg,则不对名称中的正斜杠进行编码。

重要:

建议用户编写自己的自定义UriEncode函数,以确保您的编码可以正常工作。

以下是Java中的示例UriEncode()函数。


public static String UriEncode(CharSequence input, boolean encodeSlash) {

          StringBuilder result = new StringBuilder();

          for (int i = 0; i < input.length(); i++) {

              char ch = input.charAt(i);

              if ((ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z') || (ch >= '0' && ch <= '9') || ch == '_' || ch == '-' || ch == '~' || ch == '.') {

                  result.append(ch);

              } else if (ch == '/') {

                  result.append(encodeSlash ? "%2F" : ch);

              } else {

                  result.append(toHexUTF8(ch));

              }

          }

          return result.toString();

      }

 

1.创建规范请求

将请求的内容(包括主机、操作、请求头等)组织为标准规范格式。规范请求是用于创建待签字符串的输入之一。伪代码如下:

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

  • HTTPMethod是HTTP方法,例如GET,PUT,HEAD和DELETE。

  •  CanonicalURI是URI的绝对路径,以域名后面的“/”开头,直到字符串的末尾或者问号字符('?')截止。例如/examplebucket/myphoto.jpg

  • CanonicalQueryString是URI编码后的查询字符串参数。用户需要单独对参数名称和值进行URI编码。并需要按参数名称的字母顺序,对参数进行排序。排序在编码后进行。以下URI示例中的查询字符串是 prefix=somePrefix&marker=someMarker&max-keys=20:

http://oos-cn.ctyunapi.cn/examplebucket?prefix=somePrefix&marker=someMarker&max-keys=20

 CanonicalQueryString的构造方式如下(为了便于阅读,添加了换行符):

UriEncode("marker")+"="+UriEncode("someMarker")+"&"+ UriEncode("max-keys")+"="+UriEncode("20") + "&" + UriEncode("prefix")+"="+UriEncode("somePrefix")

   当请求的目标是子资源时,相应的查询参数的值设置为空字符串(“”)。例如,下面的请求用于设置Bucket的ACL权限:

http://oos-cn.ctyunapi.cn/examplebucket?acl

       推荐:TOP云智能建站优惠活动,仅880元即可搭建一个后台管理五端合一的智能网站(PC网站、手机网站、百度智能小程序、微信小程序、支付宝小程序),独享百度搜索SEO优势资源,让你的网站不仅有颜值有排面,更有排名,可以实实在在为您带来效益,请点击进入TOP云智能建站>>>,或咨询在线客服了解详情。



我们已经准备好了,你呢?

2023我们与您携手共赢,为您的企业形象保驾护航!

在线客服
联系方式

热线电话

131-3501-0006

上班时间

周一到周五

公司电话

130-0743-9476

二维码
线