备份下载签名

最近更新时间:2019-05-15 12:19:36

操作场景

本文为您介绍获取备份下载 URL 后,通过使用 API 密钥对 URL 进行签名的操作。

注意:

以下示例中的 secretId 以及签名值仅作示例,不可将其进行使用。

操作步骤

获取备份下载 URL

方式一:通过控制台下载 URL

  1. 在实例管理页,单击【备份管理】,选择备份列表或 Binlog 列表。
  2. 选择需要下载的备份,在【操作】列单击【下载】。(冷备数据可以选择【全部下载】下载整个数据库实例或者【部分下载】下载部分数据库、数据表)。
  3. 获取 URL。

方式二:通过 API 获取下载链接,参见 API 文档

获取到的 URL 格式如下(以下仅为示例):

http://gz.dl.cdb.qcloud.com/c85be5fa579da84af33f0efd49b1b7cd?appid=8888888888&time=1478778522&sign=ZDxBCfRuFXDITwXY4C7%2BkTDAlDE%3D

选择 API 密钥

选择一个 API 密钥用于对链接签名,以下密钥仅用于示例:

  • secretId: AKID1agWVShCU7cQxKh33n9w98kwxxxxxxx
  • secretkey: 7v64T1gUSB8hCazvDJUWxVxxxxxxxx

对 URL 进行签名

以下签名示例使用上面的 URL、secretId、secretkey。

  1. 将 URL 的参数进行解析,并加入 secretId,得到如下格式的参数:
    {
    appid: 8888888888,
    time: 1478778522,
    sign: ZDxBCfRuFXDITwXY4C7%2BkTDAlDE%3D,
    secretId: AKID1agWVShCU7cQxKh33n9w98kwxxxxxxx
    }
  2. 对参数按照 key 降序排序拼接,得到如下格式:
    排序:
    {
    appid: 8888888888,
    secretId: AKID1agWVShCU7cQxKh33n9w98kwxxxxxxx,
    sign: ZDxBCfRuFXDITwXY4C7%2BkTDAlDE%3D,
    time: 1478778522
    }
    拼接:
    appid=8888888888&secretId=AKID1agWVShCU7cQxKh33n9w98kwxxxxxxx&sign=ZDxBCfRuFXDITwXY4C7%2BkTDAlDE%3D&time=1478778522
  3. 采用 sha1 算法,以及 secretkey 密钥对上一步骤拼接的参数进行计算,得到签名,并将签名转为 base64 编码格式。
    签名值(signature):3wRBMgzkhnsCtDSR1Pb07Mxq%2FgA%3D
  4. 生成新的下载链接,将 secretId 和生成的签名附加在原有的 URL 后面,完成签名。
    http://gz.dl.cdb.qcloud.com/c85be5fa579da84af33f0efd49b1b7cd?appid=8888888888&time=1478778522&sign=ZDxBCfRuFXDITwXY4C7%2BkTDAlDE%3D&secretId=AKID1agWVShCU7cQxKh33n9w98kwxxxxxxx&signature=3wRBMgzkhnsCtDSR1Pb07Mxq%2FgA%3D

Nodejs 示例代码

var libUrl = require('url');
var crypto = require('crypto');
var libQuery = require('querystring');

function sign(url, SecretId, secretKey){
    //下载URL解析
    url += '&secretId=' + SecretId;
    var uinfo = libUrl.parse(url);
    var param = libQuery.parse(uinfo.query);

    //参数排序
    var keys = Object.keys(param).sort();
    var sortUrl = [];
    for(var i in keys){
        sortUrl.push(keys[i] + '=' +param[keys[i]]);
    }
    sortUrl = sortUrl.join('&');

    //签名计算
    var hmac = crypto.createHmac('sha1', secretKey);
    param['signature'] = hmac.update(new Buffer(sortUrl, 'utf8')).digest('base64');

    //生成新的下载URL
    var newUrl = 'http://' + uinfo.host + uinfo.pathname + '?';
    sortUrl = [];
    for(var i in param){
        sortUrl.push(i + '=' + encodeURIComponent(param[i]));
    }
    newUrl += sortUrl.join('&');
    return newUrl;
}