签名与鉴权

最近更新时间:2019-06-10 17:09:15

腾讯移动服务通过签名来验证请求的合法性。开发者通过将签名授权给客户端,使其具备上传下载及管理指定资源的能力。
签名分为多次有效签名和单次有效签名:
多次有效签名:签名中绑定或者不绑定文件 fileid,需要设置大于当前时间的有效期,有效期内此签名可多次使用,有效期最长可设置三个月。
单次有效签名:签名中绑定文件 fileid,有效期必须设置为 0,此签名只可使用一次,且只能应用于被绑定的文件。
具体适用场景参见签名适用场景。

签名算法

获取签名所需信息

生成签名所需信息包括 APPID(例如1250000000),Bucket 名称,项目的 SecretID 和 SecretKey。

获取这些信息的方法如下:

  1. 登录 数据万象控制台,单击左侧菜单栏【Bucket 管理】,选择需要管理的存储桶,单击【Bucket 配置】,即可查看 Bucket 名称和 Bucket ID 。若当前项目无存储桶,您可参考 创建存储桶 文档进行创建。
  2. 单击【密钥管理】左侧导航栏,按照页面提示,单击超链跳转到云 API 密钥控制台获取密钥。

拼接签名串

拼接有效签名串:
a=[appid]&b=[bucket]&k=[SecretID]&e=[expiredTime]&t=[currentTime]&r=[rand]&f=[fileid]

注意:

有效签名串中 fileid 为可选参数,为空不绑定资源,例如上传签名和下载签名(不绑定资源);不为空,则为绑定资源,例如绑定资源的下载,只能对绑定的资源进行下载。

签名串中各字段含义如下:

字段 解释
a 开发者的项目 ID,接入对象存储服务创建存储桶时系统生成的唯一标识项目的 ID,即 APPID
b Bucket 名称,即 BucketName
k 项目的 SecretID
t 当前时间戳,是一个符合 Unix Epoch 时间戳规范的数值,单位为秒
e 多次有效签名时,e 为签名的失效时刻,是一个符合 Unix Epoch 时间戳规范的数值,单位为秒。e 的计算方式为 e = t + 签名有效时长。签名有效时长最大取值为7776000(90天);单次签名时,e 必须设置为 0
r 随机串,无符号10进制整数,用户需自行生成,最长10位
f fileid ,唯一标识存储资源的相对路径。格式为 /appid/bucketname/dirname/[filename]并且需要对其中非 '/' 字符进行 UrlEncode 编码。 当操作对象为文件夹时,filename 缺省。filename 中要包含文件后缀名。

注意:

  • 当签名类型需要绑定 fileid 时,f 字段请按要求赋值。
  • 拼接单次有效签名的签名串时,过期时间 e 必须设置为0,以保证此签名只能针对固定资源使用一次;
  • 拼接多次有效签名的签名串时,过期时间 e 的单位为秒,不同编程语言获得的系统 Unix 时间戳单位可能有所差异(比如 Java 是毫秒),请统一转化为秒。
  • 当前不支持使用子账号密钥,如需使用请 联系我们

具体适用场景请参阅 签名适用场景

生成签名

  1. 数据万象使用 HMAC-SHA1 算法对请求进行加密(SHA1 算法加密后的输出必须是原始的二进制数据,否则签名失败);
  2. 签名串需要使用 Base64 编码。即生成签名的公式如下:
    SignTmp = HMAC-SHA1(SecretKey, orignal)
    Sign = Base64(SignTmp.orignal)
    其中 SecretKey 为项目密钥 SecretKey,orignal 已拼接签名串 ,首先对 orignal 使用 HMAC-SHA1 算法进行签名,然后将 orignal 附加到签名结果的末尾,再进行 Base64 编码,得到最终的 sign。

注意:

此处使用的是标准的 Base64 编码,而不是 urlsafe 的 Base64 编码。

示例

本节介绍生成签名的算法实例,实例中使用 PHP 语言(若开发者使用其他开发语言,请使用对应的函数)。

获取签名所需信息

获取得到的签名所需信息如下:

  • 项目 ID:1250000000
  • Bucket 名称:examplebucket
  • SecretID:AKIDUfLUEUigQiXqm7CVSspKJnuaiIKt
  • SecretKey:bLcPnl88WU30VY57ipRhSePfPdOf

拼接签名串

拼接的多次有效签名串 multi_effect_signature 如下:

a=1250000000&b=examplebucket&k=AKIDUfLUEUigQiXqm7CVSspKJnuaiIKt&e=1437995704&t=1437995644&r=2081660421&f=/1250000000/examplebucket/tencent_test.jpg

拼接的单次有效签名串 once_signature 如下:

a=1250000000&b=examplebucket&k=AKQWEfLUEUigQiXqm7CVSspKJnuaiIKtxqAv&e=0&t=1437995645&r=1166710792&f=/1250000000/examplebucket/tencent_test.jpg

$appid = "1250000000";
$bucket = "examplebucket";
$secret_id = "AKQWEfLUEUigQiXqm7CVSspKJnuaiIKt";
$secret_key = "bLcPnl88WU30VY57ipRhSePfPdOf";
$expired = time() + 60;
$onceExpired = 0;
$current = time();
$rdm = rand();
$fileid = "/1250000000/examplebucket/tencent_test.jpg";
$multi_effect_signature = 'a='.$appid.'&b='.$bucket.'&k='.$secret_id.'&e='.$expired.'&t='.$current.'&r='.$rdm.'&f=';
$once_signature= 'a='.$appid.'&b='.$bucket.'&k='.$secret_id.'&e='.$onceExpired.'&t='.$current.'&r='.$rdm.'&f='.$fileid; 

生成签名

$multi_effect_signature = base64_encode(hash_hmac('SHA1', $multi_effect_signature, $secret_key, true).$multi_effect_signature); $once_signature = base64_encode(hash_hmac('SHA1',$once_signature,$secret_key, true).$once_signature); echo $multi_effect_signature."\n"; echo $once_signature."\n"; 

最终得到的多次有效签名为:

v6+um3VE3lxGz97PmnSg6+/V9PZhPTIwMDAwMSZiPW5ld2J1Y2tldCZrPUFLSURVZkxVRVVpZ1FpWHFtN0NWU3NwS0pudWFpSUt0eHFBdiZlPTE0NzA3MzcwMDAmdD0xNDcwNzM2OTQwJnI9NDkwMjU4OTQzJmY9

单次有效签名为:

CkZ0/gWkHy3f76ER7k6yXgzq7w1hPTIwMDAwMSZiPW5ld2J1Y2tldCZrPUFLSURVZkxVRVVpZ1FpWHFtN0NWU3NwS0pudWFpSUt0eHFBdiZlPTAmdD0xNDcwNzM2OTQwJnI9NDkwMjU4OTQzJmY9LzIwMDAwMS9uZXdidWNrZXQvdGVuY2VudF90ZXN0LmpwZw==

签名适用场景

数据万象对签名的适用场景做了如下限制:

场景 适用签名
文件管理类(上传、查询、复制、删除等) 前往查看文档
下载(无防盗链) 不验证签名
下载(开启防盗链,绑定资源) 多次有效签名
下载(开启防盗链,不绑定资源) 多次有效签名
图片鉴黄 多次有效签名
OCR 识别(身份证识别、名片识别) 多次有效签名
人脸识别(人脸检测与分析、五官定位、人脸比对与验证、人脸检索、人脸核身等) 多次有效签名
图片标签 多次有效签名