2015-09-26 87 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數組,所以你可以比較兩個。