在Go中验证GitHub Webhook HMAC签名

8
我已经编写了以下函数,用于验证GitHub API返回的Webhook负载中包含的X-Hub-Signature请求头。请参考以下代码:
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
}

然而,这似乎不起作用,因为我无法使用正确的密钥进行验证。以下是一个示例输出,如果有帮助的话:
HUB SIGNATURE: sha1=026b77d2284bb95aa647736c42f32ea821d6894d
EXPECTED HASH: 86b6fa48bf7643494dc3a8459a8af70008f6881a

我已经使用hmac-examples库中的逻辑作为指南并实现了代码。然而,我无法理解这种差异背后的原因。
如果有人能指出我在这里犯的微小错误,我将不胜感激。
参考:传送头
1个回答

12

虽然这真的很尴尬,但我还是想分享一下我如何修复它。

我发送了错误的key作为输入,这导致所有混淆。

所得到的教训:

  1. 上述代码片段是绝对正确的,并且可以用作验证器。
  2. 每个人都会犯愚蠢的错误,但只有聪明人承认并纠正。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接