火币网API加密与JWT加密

起因:由于最近比特币大涨,加之最近在了解金融量化相关的知识。顺理成章接触到了火币网的API,其API的大部分操作并不需要验证操作者的身份,例如行情信息等。但是涉及账户的安全信息时,都会需要一个“合法”的身份才能取得权限。结合曾经了解过的JWT验证方式,所以才能水今年的第一篇文章,水平能够很有限,请大佬轻喷。 使用火币网提供的API获取虚拟货币的行情信息或者其他信息时,有两种方式,第一种使用常见的HTTP(/S)方式,第二种使用websocket,其二者都有相应的优势。HTTP更常见,随处可见的例子和文档支持。ws可以保持长链接,也就为双方的通信建立了可靠的连接。服务端可以主动为客户端推送消息,而HTTP则只能被动返回数据。 首先我们了解火币网的验证方式,火币网它使用get或者post,将验证添加在访问的url内即可,他的验证流程所需要的信息都包含在url中。基本的验证URL可以分为三部分,第一部分是协议头,如:https://,来声明使用的是https协议。第二部分是基础域名,如:api.huobi.pro或者

api-aws.huobi.pro。第三部分是功能路径,例如查看账户信息的路径“/v1/account/accounts”,第四部分为添加的url参数部附加分,该部分除了必要的几个参数外,另外一个重要的参数Signature即是签名部分。所以我们看到的请求url是这样的:https://api.huobi.pro/v1/order/orders?AccessKeyId=e2xxxxxx-99xxxxxx-84xxxxxx-7xxxx&order-id=1234567890&SignatureMethod=HmacSHA256&SignatureVersion=2&Timestamp=2017-05-11T15%3A19%3A30&Signature=4F65x5A2bLyMWVQj3Aqp%2BB4w%2BivaA7n5Oi2SuYtCJ9o%3D 我们着重去了解该URL中的蓝色部分。从官方的文档可以得出该部分是将一个字符串首先通过HMAC-SHA256方法将其加密,接着将加密字符串通过base64进行编码得出Signature的值。

既然我们知道基本流程,我们还需要得到原始的明文字符串,通过查看官方文档可以了解到字符串的拼凑过程,首先是四个必须的参数:

AccessKeyId-通过在火币官网获取的accesskey,SignatureMethod-固定为HmacSHA256,SignatureVersion固定值为2,Timestamp为当前的格式化时间,需要以YYYY-MM-DDThh:mm:ss格式添加并且进行 URL 编码。如下图:

接下来我们只需要将这些参数的键(keys)通过ASCII排序后拼凑成待加密的字符串即可。

通过以上操作,将一个python的字典数据成功转化为以下形式:AccessKeyId=e2xxxxxx-99xxxxxx-84xxxxxx-7xxxx&SignatureMethod=HmacSHA256&SignatureVersion=2&Timestamp=2021-03-10T15%3A19%3A30(Tips:如果有其他的参数添加在原始字典中即可,排序也需要将其他的参数一通排序)

但是以上字符串并不完整,还需要添加一下基本的内容:

那么通过以上的操作之后,得到最终的待加密字符串为:GET\napi.huobi.pro\n/v1/account/accounts\nAccessKeyId=e2xxxxxx-99xxxxxx-84xxxxxx-7xxxx&SignatureMethod=HmacSHA256&SignatureVersion=2&Timestamp=2021-03-10T15%3A19%3A30  我们在得到这些字符串中后可以进行加密编码操作:

最终就可以得到Signature的值,之后再将这些拼凑成一个完整的url,使用GET方法访问就可以得到想要的返回内容了。以下为最终的url:https://api.huobi.pro/account/accounts?AccessKeyId=e2xxxxxx-99xxxxxx-84xxxxxx-7xxxx&SignatureMethod=HmacSHA256&SignatureVersion=2&Timestamp=2017-05-11T15%3A19%3A30&Signature=4F65x5A2bLyMWVQj3Aqp%2BB4w%2BivaA7n5Oi2SuYtCJ9o%3D

这部分的DEMO链接我会放在文章末尾,接下来让我们重新审视一遍这个流程,首先将参数合成的url加密,将加密结果作为一个新的Signature参数,最终将参数拼成一个全新的URL。

同样有另外一种适用于JSON的认证方式JWT(json web token),该方法可以不关心我是谁,只需要关心我是否有做某件事的权利。代码如下:

因为JWT说白了就是对JSON数据的操作,因此可以普遍得到语言的支持JAVA,JavaScript,NodeJS,PHP等,并且由于JWT由三部分组成,其中的payload可以储存一些不敏感的信息,易于业务处理和应用的扩展。

  火币网API签名DEMO:https://github.com/Pidbid/huobi_sign ——wicos 2021/3/10 晚


火币网API加密与JWT加密
https://www.wicos.me/jishu/1011/
作者
Wicos
发布于
2021年3月10日
许可协议