Skip to content
大纲

为了防止API调用过程中被恶意篡改,除部分匿名请求外,绝大多数API请求都需要携带签名信息

公共参数

参数名称类型是否必须描述
akStringAK,身份标识
skString不参与SK、身份秘钥,不传递、只参数计算sign
verString版本,默认v1
algString算法,默认hmac-sha256
tsLong时间戳、允许最大时间误差为10分钟
nonceString随机数
signString签名信息

签名过程

  1. 对所有API请求的URL Query参数(含公共参数和业务参数,但不包含sign参数和byte[]类型参数),根据参数名称的ascii码表的顺序排序。如:foo=1, bar=2, foo_bar=3, foobar=4排序后的顺序是ak=test, alg=md5, bar=2, foo=1, foo_bar=3, foobar=4, nonce=ce1d, ts=1700540707254, ver=v1。
  2. 将排序好的参数名和参数值拼装在一起。如上述的结果:ak=testalg=md5bar=2foo=1foo_bar=3foobar=4nonce=ce1dts=1700540707254ver=v1
  3. 将拼好的字符串采用UTF-8编码,使用签名算法对编码后的字节流进行摘要。如使用MAC算法,则将sk作为秘钥来加进行摘要,如hmac_md5( sk, ak=testalg=md5bar=2foo=1foo_bar=3foobar=4nonce=ce1dts=1700540707254ver=v1) ;如使用MessageDigest算法,则需在拼装的字符串前后加上sk,再进行摘要,如md5( sk+ak=testalg=md5bar=2foo=1foo_bar=3foobar=4nonce=ce1dts=1700540707254ver=v1+sk)。
  4. 将摘要取得的字节流结果使用十六进制小写表示,并填入sign参数

实例说明

shell
curl -X GET 'https://bj.fos.ic.flymeyun.com/some-service/api/v1/do?foo=1&bar=2'

将请求中的URL Query参数按ASCII码升序排列拼接,得到

ak=testalg=md5bar=2foo=1nonce=ce1dts=1700540707254ver=v1

假定使用md算法,前后拼接上SK(假定是s123456),得到

s123456ak=testalg=md5bar=2foo=1nonce=ce1dts=1700540707254ver=v1s123456

使用MD5摘要,并将摘要得到的字节流结果使用32位小写十六进制表示,得到最终的签名

afdc789871a94aece6dde15df604800e

最终请求的地址为

shell
curl -X GET 'https://bj.fos.ic.flymeyun.com/some-service/api/v1/do?foo=1&bar=2&ak=test&ver=v1&alg=md5&nonce=ce1d&ts=1700540707254&sign=afdc789871a94aece6dde15df604800e'