【问题标题】:Validating GitHub Webhook HMAC signature in Go在 Go 中验证 GitHub Webhook HMAC 签名
【发布时间】:2019-04-14 00:47:57
【问题描述】:

我编写了以下函数来验证 GitHub API 返回的 X-Hub-Signature 请求标头作为 webhook 有效负载的一部分。

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

【问题讨论】:

    标签: go webhooks github-api hmacsha1


    【解决方案1】:

    这真的很尴尬,但我仍然想分享我是如何解决它的。

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

    经验教训:

    1. 上面的代码sn-p绝对正确,可以作为验证器使用。
    2. 每个人都会犯愚蠢的错误,但只有聪明的人会承认错误并改正。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-12
      • 1970-01-01
      • 1970-01-01
      • 2016-03-16
      • 1970-01-01
      • 2020-07-17
      相关资源
      最近更新 更多