【问题标题】:Golang - Dropbox webhook signature validation hmacGolang - Dropbox webhook 签名验证 hmac
【发布时间】:2018-01-02 22:59:50
【问题描述】:

我正在编写一个需要使用 Dropbox 的 webhook 的程序。我还没有找到任何已经到位的 Go 实现,所以我决定编写我的。不幸的是,它似乎不起作用。

我认为这里的问题在于 hmac,因为我很可能做错了什么,但我似乎无法理解这里的问题到底出在哪里。有什么想法吗?

以下是我所拥有的:

package dboxwebhook

import (
    "bytes"
    "crypto/hmac"
    "crypto/sha256"
    "errors"
    "io"
    "io/ioutil"
    "log"
)

type Signature struct {
    AppSecret []byte
    Signature []byte
}

func (w *Signature) Check(reqBody io.ReadCloser) error {

    if bytes.Compare(w.Signature, nil) == 0 {
        return errors.New("DropBox signature doesnt exist")
    }

    // building HMAC key (https://golang.org/pkg/crypto/hmac/)
    mac := hmac.New(sha256.New, w.AppSecret)
    requestBody, err := ioutil.ReadAll(reqBody)
    if err != nil {
        return err
    }

    mac.Write(requestBody)
    expectedMac := mac.Sum(nil)

    log.Println(w.AppSecret)
    log.Println(expectedMac)
    log.Println(w.Signature)

    // compare if it corresponds with the signature sent by DropBox
    comparison := hmac.Equal(w.Signature, expectedMac)

    if !comparison {
        return errors.New("Signature Check unsuccessful")
    }

    return nil

}

要对此进行测试,我知道的唯一方法是使用 Dropbox 中的 this Python script

【问题讨论】:

  • 您是否尝试过记录请求正文以验证它是否与发送的数据匹配?
  • 我假设您看到的是“签名检查不成功”?另一个随机猜测:标头中的签名将是十六进制编码的,因此请确保无论您在何处解析它,都正确执行。如果您提供示例输入和您正在计算的哈希值,这个问题会更容易回答,因为错误可能出现在很多地方。
  • w.Signature 是 DropBox 发送的十六进制编码密钥。就我而言,根据 DropBox 的文档,我应该使用我的 secret 字符串作为密钥对正在发送的请求正文进行编码。然后我需要比较这两个值并确保它们相同。但是,目前它们不是。
  • 如果您要比较的签名是十六进制编码的,那么您还需要对您计算的签名进行十六进制编码。看起来你没有这样做。
  • 不是expectedMac 十六进制编码吗?我做错了什么?

标签: go dropbox-api hmac sha256 webhooks


【解决方案1】:

Dropbox 签名作为字符串在 HTTP 标头 X-Dropbox-Signature 中发送。

为了将它与hmac.Equal 一起使用,您需要先使用包encoding/hex 将十六进制字符串表示解码为字节切片。

    import "encoding/hex"

    [...]
    hexSignature, err := hex.DecodeString(w.Signature)
    [...]

那么你可以在比较中使用十六进制字节

    [...]
    // compare if it corresponds with the signature sent by DropBox
    comparison := hmac.Equal(hexSignature, expectedMac)
    [...]

【讨论】:

    猜你喜欢
    • 2019-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-16
    • 2020-07-17
    • 2021-12-25
    • 2022-06-28
    • 2013-09-12
    相关资源
    最近更新 更多