签名算法

最近更新时间: 2024-10-17 17:10:00

1 签名与鉴权

腾讯云金融专区移动服务通过签名来验证请求的合法性。开发者通过将签名授权给客户端,使其具备上传下载及管理指定资源的能力。签名分为多次有效签名单次有效签名

  • 多次有效签名:签名中不绑定文件fileid,需要设置大于当前时间的有效期,有效期内此签名可多次使用,有效期最长可设置三个月。

  • 单次有效签名:签名中绑定文件fileid,有效期必须设置为0,此签名只可使用一次,且只能应用于被绑定的文件。

2 签名算法

2.1 获取签名所需信息

生成签名所需信息包括项目ID(appid),空间名称(bucket,文件资源的组织管理单元),项目的Secret ID和Secret Key。获取这些信息的方法如下:

  1. 登录 云对象存储, 进入云对象存储空间;

  2. 如开发者未创建空间,可添加空间,空间名称(bucket)由用户自行输入;

  3. 点击“获取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 生成签名

  1. COS(对象存储服务)使用 HMAC-SHA1 算法对请求进行签名;

  2. 签名串需要使用 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防盗链) 多次有效签名
删除目录、文件 单次有效签名
更新目录、文件 单次有效签名