我无法成功验证Trello发出的Webhook请求。这就是我所知道的。

Trello的webhook文档here指出:



这是可以理解的。他们继续说



这对我来说还不太清楚。我的理解是,有效负载的每个字符(body + callbackURL)已放入8位整数中,而忽略了溢出。 (因为8211 == 0b10000000010011和0b00010011 == 19)这是我认为问题所在。

我用来解决Trello的节点有效载荷问题的函数是:

func bitShift(s string) []byte {
    var byteString []byte

    // For each rune in the string
    for _, c := range s {

        // Create a byte slice
        b := []byte(string(c))

        // Take the sign off the least significant byte
        tmp := b[len(b)-1] << 1
        tmp = tmp >> 1

        // Append it to the byte string
        byteString = append(byteString, tmp)
    }
    return byteString
}

我也有可能在基本验证步骤中做错了什么。尽管我对此有些陌生,但对我来说似乎还可以。

// VerifyNotificationHeader ...
func VerifyNotificationHeader(signedHeader, trelloAPISecret string, requestURL *url.URL, body []byte) bool {

    // Put callbackURL and body into byte slice
    urlBytes := bitShift(requestURL.String())
    bitBody := bitShift(string(body))

    // Sign, hash, and encode the payload
    secret := []byte(trelloAPISecret)
    keyHMAC := hmac.New(sha1.New, secret)
    keyHMAC.Write(append(bitBody, urlBytes...))
    signedHMAC := keyHMAC.Sum(nil)
    base64signedHMAC := base64.StdEncoding.EncodeToString(signedHMAC)

    if comp := strings.EqualFold(base64signedHMAC, signedHeader); !comp {
        return false
    }
    return true
}

让我知道您是否需要更多信息。谢谢!

更新:已解决,请查看答案。

最佳答案

为什么要扔掉MSB?您正在将每个rune转换为byte,这是无符号的(实际上是uint8的别名),因此该位保留了丢失的信息。

您可以考虑改用这样的函数:

func ascii(s string) []byte {
    var ret []byte
    for _, r := range s {
        ret = append(ret, byte(r))
    }
    return ret
}

由于runeint32的别名,因此对byte的强制转换只会删除前24位,这就是您想要的。

(注意:这假定为低端字节序。)

关于security - 验证Trello Webhook签名,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34209823/

10-12 18:14