我编写了以下函数,用于验证GitHub API作为webhook负载的一部分返回的X-Hub-Signature
请求 header 。
func isValidSignature(r *http.Request, key string) bool {
// Assuming a non-empty header
gotHash := strings.SplitN(r.Header.Get("X-Hub-Signature"), "=", 2)
if gotHash[0] != "sha1" {
return false
}
defer r.Body.Close()
b, err := ioutil.ReadAll(r.Body)
if err != nil {
log.Printf("Cannot read the request body: %s\n", err)
return false
}
hash := hmac.New(sha1.New, []byte(key))
if _, err := hash.Write(b); err != nil {
log.Printf("Cannot compute the HMAC for request: %s\n", err)
return false
}
expectedHash := hex.EncodeToString(hash.Sum(nil))
log.Println("EXPECTED HASH:", expectedHash)
return gotHash[1] == expectedHash
}
但是,这似乎不起作用,因为我无法使用正确的
secret
进行验证。这是一个示例输出,如果有帮助的话:HUB SIGNATURE: sha1=026b77d2284bb95aa647736c42f32ea821d6894d
EXPECTED HASH: 86b6fa48bf7643494dc3a8459a8af70008f6881a
我已使用hmac-examples repo中的逻辑作为准则并实现了代码。但是,我无法理解这种差异背后的原因。
如果有人能指出我在这里犯的小错误,我将不胜感激。
引用:Delivery Headers
最佳答案
这确实很令人尴尬,但我仍然想分享如何解决它。
我输入了错误的key
作为输入,这引起了所有困惑。
得到教训:
关于go - 在Go中验证GitHub Webhook HMAC签名,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53242837/