2015-09-26 92 views
-1

声明:我是新来的去围棋创建哈希

我想转换一个Python函数去:

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() 

我认为下面我转到功能是接近正确的,但我做的不懂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

您可以为再生比较带来完整的代码吗? –

+0

最后一个功能:https://github.com/hedberg/django-mailgun-incoming/blob/master/mailgun_incoming/views.py – ewhitt

+1

是否有你没有使用['mailgun-go'库]的原因(https ://github.com/mailgun/mailgun-go)? –

回答

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数组,所以你可以比较两个。