签名算法

更新时间不可用

了解如何在云市场中签名算法,包括适用场景、配置步骤、实现要点和注意事项。

服务开通 RESTful API 和计量计费 RESTful API 使用签名(signature 字段)进行身份验证。签名是经过加密处理的字符串,仅在服务商和声网之间共享。服务商可以通过签名鉴定声网发送的 HTTP 请求。

本文介绍如何生成签名。

概述

签名由源串(SourceString)和密钥(apiSecret&) 经过加密算法的处理而生成,加密算法如下:

  • GET 和 PUT 方法:

    Shell
    signature = URLEncode(Base64( HMAC-SHA1( apiSecret&, SourceString) ), "UTF-8")
  • POST 方法:

    Shell
    signature = Base64( HMAC-SHA1( apiSecret&, SourceString) )

收到请求后,你需要通过上述算法自行生成一个签名。如果你生成的签名与请求中收到的签名一致,说明该请求由声网发送。

计算示例(GET 和 PUT )

以声网调用计量计费 RESTful API 查询用量为例,请求 URL 为:

Shell
https://[host]/usage?fromTs=1619913600&toTs=1619917200&pageNum=1&apiKey=pzD5XinRSlmA64tZx81fL92YcBsJK0gd&signature={signature}

则加密算法中的各项参数为:

参数值
SourceStringGET&%2Fusage&apiKey%3DpzD5XinRSlmA64tZx81fL92YcBsJK0gd%26fromTs%3D1619913600%26pageNum%3D1%26toTs%3D1619917200
apiSecretU1SXE6k57vxVRjTomgquwC2F3tH8ziOB(仅作演示,你需要换成自己的 apiSecret)
signatureSFVnCVlRbrZcjMPGTWVxAE4QWZ8%3D
表格内容超出当前宽度,可横向滚动查看更多列。

下面介绍签名计算的详细步骤。

第 1 步:构造源串

构造源串的步骤如下:

  1. 将 HTTP 请求的类型与 “&” 拼接:

    Shell
    GET&
  2. 对请求 URL 中位于 [host] 之后、? 之前的路径(即 /usage)进行 URL 编码,与 “&” 拼接。此时的源串如下:

    Shell
    GET&%2Fusage&
  3. 按字典升序排列路径参数中除 signature 以外的所有字段(即 fromTs、toTs、apiKey),字段均写为 key=value(字段名称 = 取值)的形式,不同字段用 “&” 拼接:

    Shell
    apiKey=pzD5XinRSlmA64tZx81fL92YcBsJK0gd&fromTs=1619913600&pageNum=1&toTs=1619917200
  4. 对步骤 3 得到的字符串进行 URL 编码,并与步骤 2 的源串拼接,最终生成的源串如下:

    Shell
    GET&%2Fusage&apiKey%3DpzD5XinRSlmA64tZx81fL92YcBsJK0gd%26fromTs%3D1619913600%26pageNum%3D1%26toTs%3D1619917200

第 2 步:拼接密钥

密钥由 apiSecret 和 “&” 拼接生成。其中的 apiSecret 是你在申请入驻云市场时提供给声网的信息。

例如:你提供的 apiSecret 是 U1SXE6k57vxVRjTomgquwC2F3tH8ziOB,则对应的密钥为 U1SXE6k57vxVRjTomgquwC2F3tH8ziOB&。

第 3 步:生成签名

GET 和 PUT 方法的加密算法如下:

Shell
signature = URLEncode(Base64( HMAC-SHA1( apiSecret&, SourceString) ), "UTF-8")

使用前两步的 SourceString 和 apiSecret&,生成签名如下:

Shell
SFVnCVlRbrZcjMPGTWVxAE4QWZ8%3D

计算示例(POST)

以声网调用服务开通 RESTful API 激活插件为例,请求包体为:

JSON
{
    "projectId": "430892",
    "apiKey": "pzD5XinRSlmA64tZx81fL92YcBsJK0gd",
    "signature": "To be generated"
}

请求 URL 为:

Shell
https://[host]/customers/123456/projects/new

则加密算法中的各项参数为:

参数值
SourceStringPOST&%2Fcustomers%2F123456%2Fprojects%2Fnew&apiKey%3DpzD5XinRSlmA64tZx81fL92YcBsJK0gd%26projectId%3D430892
apiSecretU1SXE6k57vxVRjTomgquwC2F3tH8ziOB(仅作演示,你需要换成自己的 apiSecret)
signatureQRJDBm3gGmlFb5ZF9XBqm7u4EkI=
表格内容超出当前宽度,可横向滚动查看更多列。

下面介绍签名计算的详细步骤。

第 1 步:构造源串

构造源串的步骤如下:

  1. 将 HTTP 请求的类型与 “&” 拼接:

    Shell
    POST&
  2. 对请求 URL 中位于 [host] 之后的路径(即 /customers/123456/projects/new)进行 URL 编码,与 “&” 拼接。此时的源串如下:

    Shell
    POST&%2Fcustomers%2F123456%2Fprojects%2Fnew&
  3. 按字典升序排列请求包体中除 signature 以外的所有字段(即 projectId、apiKey),字段均写为 key=value(字段名称 = 取值)的形式,不同字段用 “&” 拼接:

    Shell
    apiKey=pzD5XinRSlmA64tZx81fL92YcBsJK0gd&projectId=430892

    对该字符串进行 URL 编码,并与之前的源串拼接,最终生成的源串如下:

    Shell
    POST&%2Fcustomers%2F123456%2Fprojects%2Fnew&apiKey%3DpzD5XinRSlmA64tZx81fL92YcBsJK0gd%26projectId%3D430892

第 2 步:拼接密钥

密钥由 apiSecret 和 “&” 拼接生成。其中的 apiSecret 是你在申请入驻云市场时提供给声网的信息。

例如:你提供的 apiSecret 是 U1SXE6k57vxVRjTomgquwC2F3tH8ziOB,则对应的密钥为 U1SXE6k57vxVRjTomgquwC2F3tH8ziOB&。

第 3 步:生成签名

POST 方法的加密算法如下:

Shell
signature = Base64( HMAC-SHA1( apiSecret&, SourceString) )

使用前两步的 SourceString 和 apiSecret&,生成签名如下:

Shell
QRJDBm3gGmlFb5ZF9XBqm7u4EkI=