亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

驗證 Trello Webhook 簽名

驗證 Trello Webhook 簽名

Go
慕沐林林 2021-11-29 15:47:46
我在成功驗證來自 Trello 的 webhook 請求時遇到問題。這是我所知道的。Trello 的 webhook 文檔在這里指出:每個 webhook 觸發器都包含 HTTP 標頭 X-Trello-Webhook。標頭是 HMAC-SHA1 哈希的 base64 摘要。散列內容是完整的請求正文和 callbackURL 的串聯,與在 webhook 創建期間提供的完全一樣。用于簽署此文本的密鑰是您的應用程序的秘密。這是可以理解的。他們接著說由于 node 中加密實用程序的某些默認值,我們簽名的有效負載被視為二進制字符串,而不是 utf-8。例如,如果您使用破折號字符(十進制的 U+2013 或 8211),并在 Node 中用它創建一個二進制緩沖區,它將顯示為 [19] 的緩沖區,這是 8 個最低有效值8211 位。這是摘要中用于計算 SHA-1 的值。這對我來說不太清楚。我的理解是負載(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}如果您需要更多信息,請告訴我。謝謝!更新:這已解決,請查看答案。
查看完整描述

2 回答

?
九州編程

TA貢獻1785條經驗 獲得超4個贊

你為什么要扔掉 MSB?您將每個都轉換rune為byte,這是無符號的(實際上是 的別名uint8),因此該位包含您正在丟失的信息。


您可能會考慮使用這樣的函數:


func ascii(s string) []byte {

    var ret []byte

    for _, r := range s {

        ret = append(ret, byte(r))

    }

    return ret

}

由于rune是 的別名int32,因此強制轉換byte僅刪除前 24 位,這正是您想要的。


(警告:這假設小端。)


查看完整回答
反對 回復 2021-11-29
?
翻閱古今

TA貢獻1780條經驗 獲得超5個贊

我的代碼有兩個問題。主要問題是我requestURL.String()callbackURL.

在上面的評論中http.Request.URL

對于大多數請求,除 Path 和 RawQuery 之外的字段將為空。

原來,那requestURL.String()只是給的[Path]部分[Scheme]://[Host][Path]。正確的 callbackURL 是

callbackURL := "https://" + request.Host + request.URL.String()

這個答案中指出了第二個問題,對于任何正文包含第 8 位字符的請求,驗證都會失敗。


查看完整回答
反對 回復 2021-11-29
  • 2 回答
  • 0 關注
  • 213 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號