无法让 HMACsha256 产生预期结果
Trouble getting HMACsha256 to produce expected results
我正在尝试连接到 Binance API 并发现我的 HMACsha256 实现没有产生示例文档(并在命令行中执行)可以产生的结果。我正在努力提高我对 Go 的了解,但似乎无法破解这个。
这是文档("SIGNED Endpoint Examples for 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×tamp=1499827319559
当我通过以下命令使用终端时:
echo -n "symbol=LTCBTC&side=BUY&type=LIMIT&timeInForce=GTC&quantity=1&price=0.1&recvWindow=5000×tamp=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×tamp=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 显示。这里是play groundlink修改后的代码
你在这两种情况下得到了相同的结果。它只是编码不同。 openssl
命令将其编码为十六进制,您的函数使用 base64.StdEncoding.EncodeToString()
将其编码为 base64。
这里有一小段 Python 2 片段展示了这一点:
>>> 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
}
我正在尝试连接到 Binance API 并发现我的 HMACsha256 实现没有产生示例文档(并在命令行中执行)可以产生的结果。我正在努力提高我对 Go 的了解,但似乎无法破解这个。
这是文档("SIGNED Endpoint Examples for 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×tamp=1499827319559
当我通过以下命令使用终端时:
echo -n "symbol=LTCBTC&side=BUY&type=LIMIT&timeInForce=GTC&quantity=1&price=0.1&recvWindow=5000×tamp=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×tamp=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 显示。这里是play groundlink修改后的代码
你在这两种情况下得到了相同的结果。它只是编码不同。 openssl
命令将其编码为十六进制,您的函数使用 base64.StdEncoding.EncodeToString()
将其编码为 base64。
这里有一小段 Python 2 片段展示了这一点:
>>> 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
}