签名参数sign生成说明

目录

1. sign生成说明

这里以如下请求为例,来说明sign的生成步骤:

http://cosapi.myqcloud.com/api/cos_create_bucket?accessId=9999&bucketId=abc&acl=0&time=1361431471&sign=XNibuRA%2FLx3vjq1FFiv4AqzygOA%3D


Step 1. 构造源串

源串是由2部分内容用“&”拼接起来并进行UrlEncode编码:urlencode(api_name&a=x&b=y&...)

(1) 将除“sig”外的所有参数按key进行字典升序排列,将api_name和排序后的参数(key=value)用&拼接起来。
例如:

/api/cos_create_bucket&accessId=9999&acl=0&bucketId=abc&time=1361431471


(2)将上面生成的字符串进行URL编码。
请开发者关注:URL编码注意事项,否则容易导致后面签名不能通过验证。
例如:

%2Fapi%2Fcos_create_bucket%26accessId%3D9999%26acl%3D0%26bucketId%3Dabc%26time%3D1361431471


Step 2. 生成sign值

(1)获取accessKey。
在“文件操作”页面,点击“获取accessKey”按钮,即可查看到accessId和accessKey。

(2)使用HMAC-SHA1加密算法,使用 accessKey 对 Step1 中得到的源串加密。
(注:一般程序语言中会内置HMAC-SHA1加密算法的函数,例如PHP5.1.2之后的版本可直接调用hash_hmac函数。)

(3)然后将加密后的字符串进行Base64编码,得到的签名值结果如下:
(注:一般程序语言中会内置Base64编码函数,例如PHP中可直接调用 base64_encode() 函数。)

XNibuRA/Lx3vjq1FFiv4AqzygOA=


(4)由于生成的签名中可能包含“=”,因此需要再进行一次URL编码,得到的签名值结果如下:

XNibuRA%2FLx3vjq1FFiv4AqzygOA%3D

2. sign生成特例说明

下载文件时,请求中没有api_name,因此在生成签名时,不需要加入api_name。
例如,进行URL编码前,字符串如下即可:

accessId=9999&bucket=abc&path=/dir1/test.jpg&time=1361516410

3. URL编码注意事项

URL编码规则:
签名验证时,要求对字符串中除了“-”、“_”、“.”之外的所有非字母数字字符都替换成百分号(%)后跟两位十六进制数。
十六进制数中字母必须为大写。


注意事项:
1. 某些系统方法,例如.NET系统方法HttpUtility.UrlEncode会将‘=’编码成‘%3d’,而不是%3D,导致加密签名通不过验证,请开发者注意检查。

2.Java 1.3和早期版本中,调用java.net.URLEncoder下的方法进行URL编码时,某些特殊字符并不会被编码,例如星号(*)。
由于URL编码规则中规定了星号(*)必须编码,因此在请求字符串中含星号(*)的情况下如果使用了上述方法,会导致生成的签名不能通过验证。
因此,如果参数值中含有* ,在使用类java.net.URLEncoder下的方法进行编码后,需开发人员手动将星号字符“*”替换为“%2A”,否则将导致加密签名一直通不过验证,请开发者注意检查。

3. 某些语言的urlencode方法会把“空格”编码为“+”,实际上应该编码为“%20”。这也将生成错误的签名,导致签名通不过验证。
请开发者注意检查,手动将“+”替换为“%20”。
在PHP中,推荐用rawurlencode方法进行URL编码。



以上信息是否解决您的问题?

Copyright © 1998 - 2017 Tencent. All Rights Reserved.

腾讯公司 版权所有

有问必答 返回顶部