【问题标题】:Trouble getting HMACsha256 to produce expected results无法让 HMACsha256 产生预期结果
【发布时间】:2018-01-20 12:21:58
【问题描述】:

我正在尝试使用 Binance API 并发现我的 HMACsha256 实现没有产生示例文档(并在命令行中执行)可以产生的结果。我正在努力提高我的 Go 知识,但似乎无法破解这一点。

这是文档(“POST /api/v1/order 的签名端点示例”中的相关示例):https://github.com/binance-exchange/binance-official-api-docs/blob/master/rest-api.md

不看文档,这里是要点,我的关键是:

NhqPtmdSJYdKjVHjA7PZj4Mge3R5YNiP1e3UZjInClVN65XAbvqqM6A7H5fATj0j

我的价值如下:

symbol=LTCBTC&side=BUY&type=LIMIT&timeInForce=GTC&quantity=1&price=0.1&recvWindow=5000&timestamp=1499827319559

当我通过以下命令使用终端时:

echo -n "symbol=LTCBTC&side=BUY&type=LIMIT&timeInForce=GTC&quantity=1&price=0.1&recvWindow=5000&timestamp=1499827319559" | openssl dgst -sha256 -hmac "NhqPtmdSJYdKjVHjA7PZj4Mge3R5YNiP1e3UZjInClVN65XAbvqqM6A7H5fATj0j"

我收到结果

c8db56825ae71d6d79447849e617115f4a920fa2acdcab2b053c4b2838bd6b71

这是文档所建议的。但是当我使用下面的 go 程序时:

package main

import (
    "crypto/hmac"
    "crypto/sha256"
    "encoding/base64"
    "fmt"
)

func main() {
    docSecret := "NhqPtmdSJYdKjVHjA7PZj4Mge3R5YNiP1e3UZjInClVN65XAbvqqM6A7H5fATj0j"
    docQuery := "symbol=LTCBTC&side=BUY&type=LIMIT&timeInForce=GTC&quantity=1&price=0.1&recvWindow=5000&timestamp=1499827319559"
    result := hmacify(docQuery, docSecret)
    fmt.Println(result)
}

func hmacify(message string, secret string) string {
    key := []byte(secret)
    h := hmac.New(sha256.New, key)
    h.Write([]byte(message))
    return base64.StdEncoding.EncodeToString(h.Sum(nil))
}

产生结果:

yNtWglrnHW15RHhJ5hcRX0qSD6Ks3KsrBTxLKDi9a3E=

我误解了什么导致示例和命令行有如此巨大的差异?

【问题讨论】:

  • 文档的输出以十六进制显示,但您以 base64 显示输出。试试encoding/hex 包。

标签: rest go encryption hmac sha


【解决方案1】:

在这两种情况下你得到了相同的结果。它只是编码不同。 openssl 命令将其编码为十六进制,您的函数使用 base64.StdEncoding.EncodeToString() 将其编码为 base64。

这是一个小的 Python 2 sn-p 显示:

>>> x = "c8db56825ae71d6d79447849e617115f4a920fa2acdcab2b053c4b2838bd6b71"
>>> y = "yNtWglrnHW15RHhJ5hcRX0qSD6Ks3KsrBTxLKDi9a3E=".decode('base64').encode('hex')
>>> y
'c8db56825ae71d6d79447849e617115f4a920fa2acdcab2b053c4b2838bd6b71'
>>> x == y
True

要获得与命令行完全相同的结果,请按照@Anuruddha 的建议使用hex.EncodeToString()

import "encoding/hex"

func hmacify(message string, secret string) string {
    key := []byte(secret)
    h := hmac.New(sha256.New, key)
    h.Write([]byte(message))
    return hex.EncodeToString(h.Sum(nil))  // <--- change is HERE
}

【讨论】:

    【解决方案2】:

    结果以十六进制而不是 base64 显示。这是修改后代码的play ground链接

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-08-10
      • 1970-01-01
      • 2015-04-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多