Appearance
为了防止API调用过程中被恶意篡改,除部分匿名请求外,绝大多数API请求都需要携带签名信息
公共参数
参数名称 | 类型 | 是否必须 | 描述 |
---|---|---|---|
ak | String | 是 | AK,身份标识 |
sk | String | 不参与 | SK、身份秘钥,不传递、只参数计算sign |
ver | String | 否 | 版本,默认v1 |
alg | String | 否 | 算法,默认hmac-sha256 |
ts | Long | 是 | 时间戳、允许最大时间误差为10分钟 |
nonce | String | 是 | 随机数 |
sign | String | 是 | 签名信息 |
签名过程
- 对所有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。
- 将排序好的参数名和参数值拼装在一起。如上述的结果:ak=testalg=md5bar=2foo=1foo_bar=3foobar=4nonce=ce1dts=1700540707254ver=v1
- 将拼好的字符串采用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)。
- 将摘要取得的字节流结果使用十六进制小写表示,并填入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'