Проверка подписи GitHub Webhook HMAC в Go - PullRequest
0 голосов
/ 10 ноября 2018

Я написал следующую функцию для проверки заголовка запроса X-Hub-Signature, возвращаемого API GitHub как часть полезной нагрузки 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 в качестве руководства и реализовал код. Однако я не могу понять причину этого несоответствия.

Буду признателен, если кто-нибудь укажет на тривиальную ошибку, которую я здесь совершаю.

См .: Заголовки доставки

1 Ответ

0 голосов
/ 10 ноября 2018

Это действительно смущает, но все же я хотел бы поделиться тем, как мне удалось это исправить.

Я отправил неправильный key в качестве ввода, которое вызывало все недоразумения.

Извлеченные уроки:

  1. Приведенный выше фрагмент кода абсолютно правильный и может использоваться как валидатор.
  2. Каждый совершает глупые ошибки, но только мудрые признают их и исправляют.
...