签名算法
最近更新时间: 2024-10-17 17:10:00
1 签名与鉴权
腾讯云金融专区移动服务通过签名来验证请求的合法性。开发者通过将签名授权给客户端,使其具备上传下载及管理指定资源的能力。签名分为多次有效签名和单次有效签名:
多次有效签名:签名中不绑定文件fileid,需要设置大于当前时间的有效期,有效期内此签名可多次使用,有效期最长可设置三个月。
单次有效签名:签名中绑定文件fileid,有效期必须设置为0,此签名只可使用一次,且只能应用于被绑定的文件。
2 签名算法
2.1 获取签名所需信息
生成签名所需信息包括项目ID(appid),空间名称(bucket,文件资源的组织管理单元),项目的Secret ID和Secret Key。获取这些信息的方法如下:
登录 云对象存储, 进入云对象存储空间;
如开发者未创建空间,可添加空间,空间名称(bucket)由用户自行输入;
点击“获取secretKey”,获取Appid,Secret ID和Secret Key;
2.2 拼接签名串
拼接多次有效签名串:
a=[appid]&b=[bucket]&k=[SecretID]&e=[expiredTime]&t=[currentTime]&r=[rand]&f=
拼接单次有效签名串:
a=[appid]&b=[bucket]&k=[SecretID]&e=[expiredTime]&t=[currentTime]&r=[rand]&f=[fileid]
签名串中各字段含义如下:
字段 | 解释 |
---|---|
a | 开发者的项目ID,接入对象存储服务创建空间时系统生成的唯一标识项目的ID,即Appid |
b | 空间名称bucket |
k | 项目的Secret ID |
e | 签名的有效期,是一个符合UNIX Epoch时间戳规范的数值,单位为秒;单次签名时,e必须设置为0 |
t | 当前时间戳,是一个符合UNIX Epoch时间戳规范的数值,单位为秒,多次签名时,e应大于t |
r | 随机串,无符号10进制整数,用户需自行生成,最长10位 |
fileid | 资源存储的唯一标识,格式为"/appid/bucketname/用户自定义路径或资源名",并且需要对其中非'/'字符进行urlencode编码 |
注意:
- 拼接单次有效签名的签名串时,过期时间e必须设置为0,以保证此签名只能只能针对固定资源且只能使用一次;
- 删除文件必须使用单次有效签名;
- 上传必须使用多次有效签名;
2.3 生成签名
COS(对象存储服务)使用 HMAC-SHA1 算法对请求进行签名;
签名串需要使用 Base64 编码。
即生成签名的公式如下:
SignTmp = HMAC-SHA1(SecretKey, orignal)
Sign = Base64(SignTmp.orignal)
其中SecretKey为2.1节获取的项目Secret Key,orignal为2.2节中拼接好的签名串,首先对orignal使用HMAC-SHA1算法进行签名,然后将orignal附加到签名结果的末尾,再进行Base64编码,得到最终的sign。
注意:
此处使用的是标准的Base64编码,不是urlsafe的Base64编码。
3 实例
本节介绍生成签名的算法实例,实例中使用PHP语言,如果开发者使用其他与开发,请使用对应的算法。
3.1 获取签名所需信息
获取得到的签名所需信息如下。
项目ID:200001
空间名称(bucket):newbucket
Secret ID:AKIDUfLUEUigQiXqm7CVSspKJnuaiIKtxqAv
Secret Key:bLcPnl88WU30VY57ipRhSePfPdOfSruK
3.2 拼接签名串
拼接的多次有效签名串如下:
a=200001&b=newbucket&k=AKIDUfLUEUigQiXqm7CVSspKJnuaiIKtxqAv&e=1438669115&t=1436077115&r=11162&f=
拼接的单次有效签名串如下:
a=10001290&b=tencentyun&k=AKIDgaoOYh2kOmJfWVdH4lpfxScG2zPLPGoK&e=0&t=1436077115&r=11162&f=tencentyunSignTest
$appid = "200001";
$bucket = "newbucket";
$secret_id = "AKIDUfLUEUigQiXqm7CVSspKJnuaiIKtxqAv";
$secret_key = "bLcPnl88WU30VY57ipRhSePfPdOfSruK";
$expired = time() + 60;
$onceExpired = 0;
$current = time();
$rdm = rand();
$userid = "0";
$fileid = "/200001/newbucket/tencent_test.jpg";
$srcStr = 'a='.$appid.'&b='.$bucket.'&k='.$secret_id.'&e='.$expired.'&t='.$current.'&r='.$rdm.'&f=';
$srcStrOnce= 'a='.$appid.'&b='.$bucket.'&k='.$secret_id.'&e='.$onceExpired .'&t='.$current.'&r='.$rdm
.'&f='.$fileid;
3.3 生成签名
$signStr = base64_encode(hash_hmac('SHA1', $srcStr, $secret_key, true).$srcStr);
$signStrOnce = base64_encode(hash_hmac('SHA1',$srcStrOnce,$secret_key, true).$srcStrOnce);
echo $signStr."\n";
echo $signStrOnce."\n";
最终得到的多次有效签名为:
vxzLR6vzMNhBMUVzMTWKUB+LMeVhPTIwMDAwMSZrPUFLSURVZkxVRVVpZ1FpWHFtN0 NWU3NwS0pudWFpSUt0eHFBdiZlPTE0Mzc5OTU3MDQmdD0xNDM3OTk1NjQ0JnI9MjA4 MTY2MDQyMSZmPSZiPW5ld2J1Y2tldA==
单次有效签名为:
f11dDSuw86CR02Ko1INzsZstbRlhPTIwMDAwMSZrPUFLSURVZkxVRVVpZ1FpWHFtN0 NWU3NwS0pudWFpSUt0eHFBdiZlPTAmdD0xNDM3OTk1NjQ1JnI9MTE2NjcxMDc5MiZm PS8yMDAwMDEvbmV3YnVja2V0L3RlbmNlbnRfdGVzdC5qcGcmYj1uZXdidWNrZXQ=
4 签名适用场景
COS(对象存储服务)对签名的适用场景做了如下限制:
场景 | 适用签名 |
---|---|
下载(不开启token防盗链) | 不验证签名 |
上传 | 多次有效签名 |
查询目录、文件 | 多次有效签名 |
创建目录 | 多次有效签名 |
下载(开启token防盗链) | 多次有效签名 |
删除目录、文件 | 单次有效签名 |
更新目录、文件 | 单次有效签名 |