免责声明:我是Go的新手
我正在尝试将Python函数转换为Go:
def verify_signature(self, token, timestamp, signature):
return signature == hmac.new(key=self.api_key,
msg='{0}{1}'.format(timestamp, token),
digestmod=hashlib.sha256).hexdigest()
我认为我的Go函数接近正确,但我不明白Python函数的最后一行“digestmod = hashlib.sha256).hexdigest()”肯定地说:
func verify_signature (api_key, token, timestamp) {
msg := fmt.Sprintf("%s%s", timestamp, token)
mac := hmac.New(sha256.New, api_key)
mac.Write(msg)
return mac
}
答案 0 :(得分:1)
当您以不同方式格式化代码时,代码会更容易理解:
def verify_signature(self, token, timestamp, signature):
mac = hmac.new(
key=self.api_key,
msg='{0}{1}'.format(timestamp, token),
digestmod=hashlib.sha256
)
actual = mac.hexdigest()
return signature == actual
回答你的问题:hexdigest()
会将64字节数组(=将SHA256应用于消息的结果)转换为128字符的十六进制转储,更容易处理(打印/比较)。
你的Go代码并没有做同样的事情。它只是"创建actual
"部分。您错过了"与预期的signature
"相比较部分。如果预期的signature
已经是Go中的[]byte
数组,则可以使用hmac.Equal()
进行检查。
注意:您可以使用mac.Sum(nil)
获取哈希值。见https://golang.org/src/crypto/hmac/hmac.go
如果不是,那么您应该尝试将signature
中的十六进制转储转换为[]byte
数组,以便比较两者。