在Go中创建哈希

时间:2015-09-26 09:48:08

标签: python go

免责声明:我是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
}

1 个答案:

答案 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数组,以便比较两者。