签名认证

签名说明

API 请求在通过 internet 传输的过程中极有可能被篡改,为了确保请求未被更改,除公共接口(基础信息,行情数据)外的私有接口均必须使用您的 API Key 做签名认证,以校验参数或参数值在传输途中是否发生了更改。 每一个API Key需要有适当的权限才能访问相应的接口,每个新创建的API Key都需要分配权限。在使用接口前,请查看每个接口的权限类型,并确认你的API Key有相应的权限。

一个合法的请求由以下几部分组成:

  • 方法请求地址:即访问服务器地址 api.sunx.io,比如 api.sunx.io/sapi/v1/trade/order。

  • API 访问Id(AccessKeyId):您申请的 API Key 中的 Access Key。

  • 签名方法(SignatureMethod):第一种、用户使用椭圆曲线数字签名算法,使用Ed25519。‌第二种、用户计算签名的基于哈希的协议,使用 HmacSHA256。

  • Ed25519介绍:是一种高性能的数字签名算法,提供快速的签名验证和生成,同时具备高安全性。

  • 签名版本(SignatureVersion):签名协议的版本,此处使用2。

  • 时间戳(Timestamp):您发出请求的时间 (UTC 时间) 。如:2017-05-11T16:22:06。在查询请求中包含此值有助于防止第三方截取您的请求。

  • 必选和可选参数:每个方法都有一组用于定义 API 调用的必需参数和可选参数。可以在每个方法的说明中查看这些参数及其含义。

    • 对于 GET 请求,每个方法自带的参数都需要进行签名运算。

    • 对于 POST 请求,每个方法自带的参数不进行签名认证,并且需要放在 body 中。

  • 签名:签名计算得出的值,用于确保签名有效和未被篡改。

Ed25519 签名步骤

规范要计算签名的请求 因为使用 Ed25519 进行签名计算时,使用不同内容计算得到的结果会完全不同。所以在进行签名计算前,请先对请求进行规范化处理。下面以查询某订单详情请求为例进行说明:

查询某订单详情时完整的请求URL

https://api.api.sunx.io/sapi/v1/trade/order?arrow-up-right

AccessKeyId=e2xxxxxx-99xxxxxx-84xxxxxx-7xxxx

&SignatureMethod=Ed25519

&SignatureVersion=2

&Timestamp=2017-05-11T15:19:30

&order_id=1234567890

1. 请求方法(GET 或 POST,WebSocket用GET),后面添加换行符 “\n”

例如:GET\n

2. 添加小写的访问域名,后面添加换行符 “\n”

例如:api.sunx.io\n

3. 访问方法的路径,后面添加换行符 “\n”

例如查询订单: /sapi/v1/trade/order\n

例如WebSocket v1 /ws/v1

4. 对参数进行URL编码,并且按照ASCII码顺序进行排序

例如,下面是请求参数的原始顺序,且进行URL编码后

AccessKeyId=e2xxxxxx-99xxxxxx-84xxxxxx-7xxxx

order_id=1234567890

SignatureMethod=Ed25519

SignatureVersion=2

Timestamp=2017-05-11T15%3A19%3A30

使用 UTF-8 编码,且进行了 URL 编码,十六进制字符必须大写,如 “:” 会被编码为 “%3A” ,空格被编码为 “%20”。时间戳(Timestamp)需要以YYYY-MM-DDThh:mm:ss格式添加并且进行 URL 编码。时间戳有效时间5分钟。

经过排序之后

AccessKeyId=e2xxxxxx-99xxxxxx-84xxxxxx-7xxxx

SignatureMethod=Ed25519

SignatureVersion=2

Timestamp=2017-05-11T15%3A19%3A30

order_id=1234567890

5. 按照以上顺序,将各参数使用字符 “&” 连接

AccessKeyId=e2xxxxxx-99xxxxxx-84xxxxxx-7xxxx&SignatureMethod=Ed25519&SignatureVersion=2&Timestamp=2017-05-11T15%3A19%3A30&order_id=1234567890

6. 组成最终的要进行签名计算的字符串如下

GET\n

api.sunx.io\n

/sapi/v1/trade/order\n

AccessKeyId=e2xxxxxx-99xxxxxx-84xxxxxx-7xxxx&SignatureMethod=Ed25519&SignatureVersion=2&Timestamp=2017-05-11T15%3A19%3A30&order_id=1234567890

7. 用上一步里生成的 “请求字符串” 和你的密钥 (Secret Key) 生成一个数字签名

  1. 将上一步得到的请求字符串通过生成Ed25519的私钥,来加签生成签名

  2. 将生成的签名用base-64编码,得到的值作为此次接口调用的数字签名。

4F65x5A2bLyMWVQj3Aqp+B4w+ivaA7n5Oi2SuYtCJ9o=

8. 将生成的数字签名加入到请求里

对于Rest接口:

  1. 把所有必须的认证参数添加到接口调用的路径参数里

  2. 把数字签名在URL编码后加入到路径参数里,参数名为“Signature”。

最终,发送到服务器的 API 请求应该为

https://api.sunx.io/sapi/v1/trade/order?AccessKeyId=e2xxxxxx-99xxxxxx-84xxxxxx-7xxxx&order_id=1234567890&SignatureMethod=Ed25519&SignatureVersion=2&Timestamp=2017-05-11T15%3A19%3A30&Signature=4F65x5A2bLyMWVQj3Aqp%2BB4w%2BivaA7n5Oi2SuYtCJ9o%3D

对于WebSocket接口:

  1. 按照要求的JSON格式,填入参数和签名。

  2. JSON请求中的参数不需要URL编码

例如:

{ "action": "req", "ch": "auth", "params": { "authType":"api", "accessKey": "e2xxxxxx-99xxxxxx-84xxxxxx-7xxxx", "signatureMethod": "Ed25519", "signatureVersion": "2.1", "timestamp": "2019-09-01T18:16:16", "signature": "4F65x5A2bLyMWVQj3Aqp+B4w+ivaA7n5Oi2SuYtCJ9o=" }}

HmacSHA256 签名步骤

规范要计算签名的请求 因为使用 HMAC 进行签名计算时,使用不同内容计算得到的结果会完全不同。所以在进行签名计算前,请先对请求进行规范化处理。下面以查询某订单详情请求为例进行说明:

查询某订单详情时完整的请求URL

https://api.sunx.io/sapi/v1/trade/order?arrow-up-right

AccessKeyId=e2xxxxxx-99xxxxxx-84xxxxxx-7xxxx

&SignatureMethod=HmacSHA256

&SignatureVersion=2

&Timestamp=2017-05-11T15:19:30

&order_id=1234567890

1. 请求方法(GET 或 POST,WebSocket用GET),后面添加换行符 “\n”

例如:GET\n

2. 添加小写的访问域名,后面添加换行符 “\n”

例如:api.sunx.io\n

3. 访问方法的路径,后面添加换行符 “\n”

例如查询订单: /sapi/v1/trade/order\n

例如WebSocket v2 /ws/v2

4. 对参数进行URL编码,并且按照ASCII码顺序进行排序

例如,下面是请求参数的原始顺序,且进行URL编码后

AccessKeyId=e2xxxxxx-99xxxxxx-84xxxxxx-7xxxx

order_id=1234567890

SignatureMethod=HmacSHA256

SignatureVersion=2

Timestamp=2017-05-11T15%3A19%3A30

使用 UTF-8 编码,且进行了 URL 编码,十六进制字符必须大写,如 “:” 会被编码为 “%3A” ,空格被编码为 “%20”。时间戳(Timestamp)需要以YYYY-MM-DDThh:mm:ss格式添加并且进行 URL 编码。时间戳有效时间5分钟。

经过排序之后

AccessKeyId=e2xxxxxx-99xxxxxx-84xxxxxx-7xxxx

SignatureMethod=HmacSHA256

SignatureVersion=2

Timestamp=2017-05-11T15%3A19%3A30

order_id=1234567890

5. 按照以上顺序,将各参数使用字符 “&” 连接

AccessKeyId=e2xxxxxx-99xxxxxx-84xxxxxx-7xxxx&SignatureMethod=HmacSHA256&SignatureVersion=2&Timestamp=2017-05-11T15%3A19%3A30&order_id=1234567890

6. 组成最终的要进行签名计算的字符串如下

GET\n

api.sunx.io

/sapi/v1/trade/order\n

AccessKeyId=e2xxxxxx-99xxxxxx-84xxxxxx-7xxxx&SignatureMethod=HmacSHA256&SignatureVersion=2&Timestamp=2017-05-11T15%3A19%3A30&order_id=1234567890

7. 用上一步里生成的 “请求字符串” 和你的密钥 (Secret Key) 生成一个数字签名

  1. 将上一步得到的请求字符串和 API 私钥作为两个参数,调用HmacSHA256哈希函数来获得哈希值。

  2. 将此哈希值用base-64编码,得到的值作为此次接口调用的数字签名。

4F65x5A2bLyMWVQj3Aqp+B4w+ivaA7n5Oi2SuYtCJ9o=

8. 将生成的数字签名加入到请求里

对于Rest接口:

  1. 把所有必须的认证参数添加到接口调用的路径参数里

  2. 把数字签名在URL编码后加入到路径参数里,参数名为“Signature”。

最终,发送到服务器的 API 请求应该为

https://api.sunx.io/sapi/v1/trade/order?AccessKeyId=e2xxxxxx-99xxxxxx-84xxxxxx-7xxxx&order_id=1234567890&SignatureMethod=HmacSHA256&SignatureVersion=2&Timestamp=2017-05-11T15%3A19%3A30&Signature=4F65x5A2bLyMWVQj3Aqp%2BB4w%2BivaA7n5Oi2SuYtCJ9o%3Darrow-up-right

对于WebSocket接口:

  1. 按照要求的JSON格式,填入参数和签名。

  2. JSON请求中的参数不需要URL编码

例如:

{ "action": "req", "ch": "auth", "params": { "authType":"api", "accessKey": "e2xxxxxx-99xxxxxx-84xxxxxx-7xxxx", "signatureMethod": "HmacSHA256", "signatureVersion": "2.1", "timestamp": "2019-09-01T18:16:16", "signature": "4F65x5A2bLyMWVQj3Aqp+B4w+ivaA7n5Oi2SuYtCJ9o=" }}

最后更新于