用户签名验证

浪潮云对象存储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将被忽略。