使用签名验证方式

“公钥 + 私钥” 验证方式更加安全。请求地址中只包含你的“公钥”以及用你的“私钥”制作的签名,因此不会在请求地址中泄露你的私钥。

签名指的是通过 HMAC-SHA1,对请求参数加密后得到的签名字串进行身份验证,避免了将“私钥”明文包含在请求中而造成泄露。

签名的生成方式如下:

1. 构造验证参数字符串

将请求参数按照参数名字典升序排列后,把所有参数 param=value 用 & 连接起来,类似 URI 中 QueryString 的构造方式。目前支持的参数有:UNIX 时间戳 ts单位为秒,转换成字符串长度为 10 位,不要用毫秒值)、签名失效时间 ttl(单位为秒,缺省为 1800,可选)和公钥 uid。例:ts=1443079775&ttl=300&uid=your_public_key

2. 使用 HMAC-SHA1 方式,以 API 密钥中的“私钥”对上一步生成的参数字符串进行加密

常见程序语言通常会内置加密函数,或通过扩展库提供支持。例如在 NodeJS 中,您可以使用 crypto 模块中的中的 createHmac 函数,例:crypto.createHmac("sha1", your_private_key)

3. 将上一步生成的加密结果用 Base64 编码,并做一个 URLEncode,得到签名 sig

步骤(1)中的参数例子用 base64 编码后得到的结果为dTYeoN8WdOfW4PiwgEdLa0gWFzo=,做完 urlencode 最终得到的签名 sig 为dTYeoN8WdOfW4PiwgEdLa0gWFzo%3d

4. 将上一步得到的签名 sig 附在第一步构造的参数字符串后,作为请求的一个参数发送

上述例子里,请求参数即为 ts=1443079775&ttl=300&uid=your_public_key&sig=dTYeoN8WdOfW4PiwgEdLa0gWFzo%3d

注意:

  • 签名失效时间参数 ttl 是可选参数。如果忽略这个参数,生成的签名有效期默认为 1800 秒(30 分钟)。较短的有效期可以使签名更难被盗用,提高安全性,但请务必保证请求到达心知服务器的时间在签名有效期内,否则会鉴权失败。
  • 请求中的其它参数,例如 location、language 等,不参与签名。
  • 点此查看 API 产品的公钥和私钥