上云无忧 > 文档中心 > 天翼云对象存储(OOS经典版)I型用户签名验证(V4)使用Authorization请求头验证签名过程
对象存储
天翼云对象存储(OOS经典版)I型用户签名验证(V4)使用Authorization请求头验证签名过程

文档简介:
签名过程如下图所示: 下表描述了图中显示的功能。用户需要为这些函数实现代码。 功能 描述 Lowercase() 将字符串转换为小写。 Hex() 小写16进制编码。 SHA256Hash() 安全散列算法(SHA)加密散列函数。
*产品来源:中国电信天翼云。免费试用 咨询热线:400-826-7010,为您提供专业的售前咨询,让您快速了解云产品,助您轻松上云! 微信咨询
  免费试用、价格特惠

签名过程


签名过程如下图所示:

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


功能

描述

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()函数。

          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 + '\n' +

    CanonicalURI   + '\n' +

    CanonicalQueryString + '\n' +

    CanonicalHeaders + '\n' +

    SignedHeaders + '\n' +

    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:

/span>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权限:

/span>oos-cn.ctyunapi.cn/examplebucket?acl

在这种情况下,CanonicalQueryString为:

UriEncode("acl") + "=" +   ""

如果URI中不包含“?”,则请求中不存在查询字符串,此时将CanonicalQueryString设置为空字符串(“”),但仍需要包含“\ n”。

CanonicalHeaders是请求头的列表。各个请求头名称和值由换行符(“\ n”)分隔。请求头名称必须为小写。需要按字母顺序对请求头名称进行排序,示例如下:

Lowercase(<HeaderName1>)+":"+Trim(<value>)+"\n"

Lowercase(<HeaderName2>)+":"+Trim(<value>)+"\n"

...

Lowercase(<HeaderNameN>)+":"+Trim(<value>)+"\n"

CanonicalHeaders列表必须包括以下内容:

  • HTTP Host标头

  • 如果存在Content-Type请求头,则必须将其添加到 CanonicalHeaders列表中。

  • 所有x-amz-*请求头。

以下是CanonicalHeaders 的示例,请求头名称为小写并已排序。

host:s3.amazonaws.com

x-amz-content-sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

x-amz-date:20130708T220855Z

SignedHeaders是按字母顺序排序的,以分号分隔的小写请求头名称列表。列表中的请求头与用户在CanonicalHeaders字符串中包含的请求头相同。例如,对于前面的示例,SignedHeaders的值为:

host;x-amz-content-sha256;x-amz-date

HashedPayload 是请求负载的SHA256哈希的十六进制值。

如果请求中没有负载,则计算空字符串的哈希值,如下所示:

Hex(SHA256Hash(""))

哈希返回以下值:

e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855  

例如,当用户使用PUT请求上传对象时,用户可以在请求体中提供对象数据。使用GET请求检索对象时,没有请求体,所以计算空字符串的哈希。

2.创建待签名字符串

待签名的字符串格式如下:

"AWS4-HMAC-SHA256"   + "\n" +

timeStampISO8601Format   + "\n" +<Scope> + "\n" +

Hex(SHA256Hash(<CanonicalRequest>))

常量字符串AWS4-HMAC-SHA256指定用户使用的哈希算法HMAC-SHA256。

timeStamp是ISO 8601格式的当前UTC时间(例如 20180501T000000Z)。

Scope是将生成的签名绑定到指定日期,OOS区域和服务。

date.Format(<YYYYMMDD>)   + "/" + <region> + "/" + <service> +   "/aws4_request"

对于OOS,服务字符串是s3。Region为域名oos-xx.ctyunapi.cn中的xx部分。

3.计算签名

使用 secretKey作为初始哈希操作的密钥,对请求日期、区域和服务执行一系列加密哈希操作(HMAC 操作),从而派生签名密钥。伪代码如下:

DateKey =   HMAC-SHA256("AWS4"+"<SecretAccessKey>", "<YYYYMMDD>") DateRegionKey   = HMAC-SHA256(<DateKey>,   "<oos-region>") DateRegionServiceKey   = HMAC-SHA256(<DateRegionKey>,   "<oos-service>") SigningKey =   HMAC-SHA256(<DateRegionServiceKey>,   "aws4_request")

最终签名是使用签名密钥作为密钥,对待签名字符串计算得到HMAC-SHA256哈希值。伪代码如下:

HMAC-SHA256(SigningKey, StringToSign)

4.将签名信息添加到请求头

在计算签名后,将其添加到请求的 HTTP 请求头或查询字符串中。

将签名信息添加到Authorization标头的伪代码如下:

Authorization: <algorithm> Credential=<ak>/<credential_scope>, SignedHeaders=<SignedHeaders>, Signature=<signature>

相似文档
官方微信
联系客服
400-826-7010
7x24小时客服热线
分享
  • QQ好友
  • QQ空间
  • 微信
  • 微博
返回顶部