签名认证
签名说明
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?
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) 生成一个数字签名
将上一步得到的请求字符串通过生成Ed25519的私钥,来加签生成签名
将生成的签名用base-64编码,得到的值作为此次接口调用的数字签名。
4F65x5A2bLyMWVQj3Aqp+B4w+ivaA7n5Oi2SuYtCJ9o=
8. 将生成的数字签名加入到请求里
对于Rest接口:
把所有必须的认证参数添加到接口调用的路径参数里
把数字签名在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接口:
按照要求的JSON格式,填入参数和签名。
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?
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) 生成一个数字签名
将上一步得到的请求字符串和 API 私钥作为两个参数,调用HmacSHA256哈希函数来获得哈希值。
将此哈希值用base-64编码,得到的值作为此次接口调用的数字签名。
4F65x5A2bLyMWVQj3Aqp+B4w+ivaA7n5Oi2SuYtCJ9o=
8. 将生成的数字签名加入到请求里
对于Rest接口:
把所有必须的认证参数添加到接口调用的路径参数里
把数字签名在URL编码后加入到路径参数里,参数名为“Signature”。
最终,发送到服务器的 API 请求应该为
对于WebSocket接口:
按照要求的JSON格式,填入参数和签名。
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=" }}
最后更新于