腾讯云对象存储视频处理签名认证

视频处理签名认证

用户可以在HTTP请求中增加Authorization的Header来包含签名(Signature)信息,表明这个消息已被授权。

Authorization字段计算的方法Authorization="jingdong"+""+AccessKey+":"+Signature;Signature=base64(HMAC-SHA1(AccessKeySecret,UTF-8-Encoding-Of(StringToSign)))StringToSign=HTTP-Verb+" "+Content-MD5+" "+Content-Type+" "+Date+" "+CanonicalizedHeaders+CanonicalizedResource;

注意:

1.当Content-Type,Content-MD5不存在时,由空字符串代替。

2.你的AccessKey和AccessKeySecret可以登录到腾讯云的控制台,在【AccessKey管理】中查看。AccessKeySecret表示签名所需要的秘钥

3.HTTP-Verb表示HTTP请求的Method,主要有PUT,GET,POST,HEAD,DELETE等

4. 表示换行符

5.Content-MD5表示请求内容数据的MD5值,对消息内容(不包括头部)计算MD5值获得128比特位数字,对该数字进行base64编码而得到。该请求头可用于消息合法性的检查(消息内容是否与发送时一致),如”3fe8ebd7f5996651fa46c4aefe24b6af”,也可以为空。

6.Content-Type表示请求内容的类型,如”text/plain”,也可以为空

7.Date表示此次操作的时间,且必须为GMT格式,如”Sun,09Jul201706:08:40GMT”

8.CanonicalizedHeaders表示以x-jss-为前缀的httpheader的字典序排列

9.CanonicalizedResource表示用户想要访问的腾讯云对象存储资源,其中Date和CanonicalizedResource不能为空;如果请求中的Date时间和腾讯云对象存储服务器的时间差15分钟以上,腾讯云对象存储服务器将拒绝该服务,并返回HTTP403错误。

构建CanonicalizedHeaders的方法

所有以x-jss-为前缀的HTTPHeader被称为CanonicalizedHeaders。它的构建方法如下:

1.将所有以x-jss-为前缀的HTTP请求头的名字转换成小写。

2.将上一步得到的所有HTTP请求头按照名字的字典序进行升序排列。

3.删除请求头和内容之间分隔符两端出现的任何空格。

如x-jss-server-side-encryption:false转换成:x-jss-server-side-encryption:false

4.将每一个头和内容用 分隔符分隔拼成最后的CanonicalizedHeaders。

5.如果没有以x-jss-为前缀的HTTP请求头,则CanonicalizedHeaders为空字符串""。

注意:

1.CanonicalizedHeaders可以为空,无需添加最后的 。

2.如果只有一个,则如x-jss-server-side-encryption:false 注意最后的 。

3.如果有多个,注意最后的” ”。

构建CanonicalizedResource的方法

用户发送请求中想访问的腾讯云对象存储目标资源被称为CanonicalizedResource。它的构建方法如下:

1.将CanonicalizedResource置成空字符串""。

2.放入要访问的腾讯云对象存储资源/BucketName/ObjectName(无ObjectName则CanonicalizedResource为”/BucketName“,如果同时也没有BucketName则为“/”)。

示例:

关于MultipartUpload操作中ListParts的API,此时的CanonicalizedResource为:/BucketName/ObjectName?uploadId=UploadId。

说明:

多个query将会以拼接,并拼接在path?后面。例如:PUT/ObjectName?uploadId=UploadIdpartNumber=PartNumber

支持的query签名字段如下:

SUB_RESOURCES:"lifecycle","location","logging","partNumber","policy","uploadId","uploads","versionId","versioning","versions","website","acl"

RESPONSE_HEARDES:"contentType","contentLanguage","cacheControl","contentDisposition","contentEncoding"

计算签名头规则

签名的字符串必须为UTF-8格式。含有中文字符的签名字符串必须先进行UTF-8编码,再与AccessKeySecret计算最终签名。

1.签名的方法用RFC2104中定义的HMAC-SHA1方法,其中Key为AccessKeySecret。

2.Content-Type和Content-MD5在请求中不是必须的,但是如果请求需要签名验证,空值的话以空字符串代替。

签名示例

假如:

AccessKey是”qbS5QXpLORrvdrmb”,

AccessKeySecret是”1MYaiNh3NeN9SuxaqFjSrc7I49rWKkQCxpl9eLNZ”

示例请求PUT/sign.txtHTTP/1.1
Content-Type:text/plain
Content-MD5:0c791a8c18017c7ad1675936d12bae5d
x-jss-server-side-encryption:false
Date:Thu,13Jul201702:37:31GMT
Authorization:jingdongqbS5QXpLORrvdrmb:xvj2Iv7WcSwnN26XYnTq/c2YBQs=
Content-Length:20
Host:s-bj.jcloud.com签名字符串计算公式Signature=base64(hmac-sha1(AccessKeySecret,
HTTP-Verb+“ ”
+Content-MD5+“ ”
+Content-Type+“ ”
+Date+“ ”
+CanonicalizedHeaders
+CanonicalizedResource))签名字符串PUT
0c791a8c18017c7ad1675936d12bae5d
text/plain
Thu,13Jul201702:37:31GMT
x-jss-server-side-encryption:false
/oss-test/sign.txt

可用以下方法计算签名(Signature):

JAVA示例代码:

importjavax.crypto.Mac;importjavax.crypto.spec.SecretKeySpec;importorg.apache.commons.codec.binary.Base64;StringsecretKey="1MYaiNh3NeN9SuxaqFjSrc7I49rWKkQCxpl9eLNZ";StringsignString="PUT 0c791a8c18017c7ad1675936d12bae5d text/plain Thu,13Jul201702:37:31GMT x-jss-server-side-encryption:false /oss-test/sign.txt";SecretKeySpecsigningKey=newSecretKeySpec(secretKey.getBytes("UTF-8"),"HmacSHA1");Macmac=Mac.getInstance("HmacSHA1");mac.init(signingKey);byte[]rawHmac=mac.doFinal(signString.getBytes("UTF-8"));Stringsignature=newString(Base64.encodeBase64(rawHmac),"UTF-8");

签名(Signature)计算结果应该为xvj2Iv7WcSwnN26XYnTq/c2YBQs=,因为Authorization=“jingdong”+AccessKey+“:”+Signature所以最后Authorization为“jingdongqbS5QXpLORrvdrmb:xvj2Iv7WcSwnN26XYnTq/c2YBQs=”然后加上Authorization头来组成最后需要发送的消息:

PUT/sign.txtHTTP/1.1Content-Type:text/plainContent-MD5:0c791a8c18017c7ad1675936d12bae5dx-jss-server-side-encryption:falseDate:Thu,13Jul201702:37:31GMTAuthorization:jingdongqbS5QXpLORrvdrmb:xvj2Iv7WcSwnN26XYnTq/c2YBQs=Content-Length:20Host:oss.cn-north-1.jcloudcs.com细节分析:

1.如果传入的AccessKey不存在或inactive,返回403Forbidden。错误码:InvalidAccessKey。

2.传入请求的时间必须在腾讯云存储服务器当前时间之后的15分钟以内,否则返回403Forbidden。错误码:RequestTimeTooSkewed。

3.若用户请求头中Authorization值的格式不对,返回400BadRequest。错误码:InvalidToken。

腾讯云存储所有的请求都必须使用HTTP1.1协议规定的GMT时间格式。其中,日期的格式为:Wed,22May201705:29:49GMT