用户签名验证
浪潮云对象存储OSS通过使用AccessKey ID、AccessKey Secret对称加密的方法来验证请求的发送者身份信息。 AccessKey包含AccessKey ID和AccessKey Secret。其中,AccessKey ID用于标识用户,AccessKey Secret是用于用户加密签名字符串和OSS用来验证签名字符串,AccessKey Secret必须保密,不能随意泄露。
当您以个人身份向OSS发送请求时,首先需要将发送的请求按照OSS指定的格式生成签名字符串,然后使用AccessKey Secret对签名字符串进行加密产生验证码,然后通过header头或URL将加密产生的验证码和AccessKey ID同时发送给OSS。OSS收到请求后,通过AccessKey ID找到对应的AccessKey Secret,并以同样的方法计算签名字符串和验证码。如果计算出来的验证码和http请求发送的验证码一致,该请求有效;否则,请求无效,OSS将拒绝处理这次请求,并返回HTTP 403错误。
签名计算方法
Signature = base64(HMAC-SHA1(AccessKeySecret,
VERB + "\n"
+ Content-MD5 + "\n"
+ Content-Type + "\n"
+ Date + "\n"
+ CanonicalizedOSSHeaders
+ CanonicalizedResource))
其中:
1、AccessKeySecret
表示签名所需的秘钥,详见用户签名验证。
2、VERB
表示HTTP请求的Method,详见请求结构中3.请求方法
。
3、\n
表示换行符。
4、Content-MD5
为请求头Content-MD5的内容,详见公共请求头。
5、Content-Type
为请求头Content-Type的内容,详见公共请求头。
6、Date
为请求头Date的内容,详见公共请求头。
7、CanonicalizedOSSHeaders
表示以x-oss-
为前缀的HTTP Header转换为小写后的字典序排列。
8、CanonicalizedResource
表示用户想要访问的OSS资源。
构建CanonicalizedOSSHeaders
1、将所有以x-oss-
为前缀的HTTP请求头的名字转换成小写的形式。例如X-OSS-Meta:INSPUR
转换成x-oss-meta:INSPUR
。
2、将1中得到HTTP请求头按照字典序进行升序排列。
3、删除请求头和内容之间分隔符两端出现的任何空格。例如x-oss-meta: inspur
转换为x-oss-meta:inspur
。
4、将3中请求头和内容用\n
分隔符分隔后得到CanonicalizedOSSHeaders。
5、CanonicalizedOSSHeaders可以为空,当为空时无需添加\n
;当不为空时,每个请求头后都要跟一个\n
。
构建CanonicalizedResource
请求中想要访问的资源被称为CanonicalizedResource,构建方法如下:
1、将CanonicalizedResource置为空字符串""
。
2、设置要访问的OSS资源字符串。
资源 | 资源字符串 |
---|---|
有Bucket和Object | /BucketName/ObjectName |
仅有Bucket | /BucketName/ |
既没有Bucket也没有Object | / |
3、设置要访问的OSS子资源字符串,子资源例如partNumber,uploadId,uploads,acl等。如果请求的资源包括子资源,首先将所有的子资源按照字典序进行升序排列,并以&
为分隔符隔开形成子资源字符串。
4、将构建的资源字符串与子资源字符串用?
连接,即资源字符串+?+子资源字符串
,例如:/BucketName/ObjectName?uploads
。
构建签名头规则
1、签名字符串必须为UTF-8
格式。含有中文字符的签名字符串必须先进行UTF-8
编码,再与AccessKey Secret计算最终签名。
2、签名的方法用RFC 2104中定义的HMAC-SHA1方法,其中Key指的是AccessKey Secret。
3、Content-Type和Content-MD5在请求中可以没有,但是如果请求需要签名验证,此时以换行符\n
代替。
4、在所有非HTTP标准定义的header中,只有以x-oss-
开头的header,需要加入签名字符串;其他非HTTP标准header将被忽略。