HMAC签名与github的x-hub-signature不匹配

时间:2017-03-14 14:08:40

标签: javascript node.js cryptography webhooks hmac

我正在处理来自github的传入Webhook,并希望验证x-hub-signature。我正在使用hmac来散列“秘密”,然后比较两个哈希值。问题是他们从不匹配。这是我的设置:

router.route("/auth")

.post((req, res) => {

    var hmac = crypto.createHmac("sha1", process.env.WEBHOOK_SECRET);
    var calculatedSignature = "sha1=" + hmac.update(JSON.stringify(req.body)).digest("hex");
    console.log(req.headers["x-hub-signature"] === calculatedSignature); // Returns false
    console.log(req.headers["x-hub-signature"]) // => sha1=blablabla
    console.log(calculatedSignature) // => sha1=foofoofoo

    res.end();
});

我已经尝试了一切,但无法使其发挥作用。想知道hmac.update()是否应该保留另一个参数而不是JSON.stringify(req.body)。有谁知道为什么他们不匹配?

2 个答案:

答案 0 :(得分:0)

所以问题在于webhook的设置。内容格式设置为application / x-www-form-urlencoded,由于某种原因,对x-hub-signature进行了不同的散列。我刚把它改成了application / json,然后就运行了!

答案 1 :(得分:0)

如果webhook Content-Type设置为application/x-www-url-encoded,则需要使用字符串来检查HMAC是 "payload=" + query_encoded_payload

例如golang

payloadForm := r.PostFormValue("payload")
escaped := url.QueryEscape(payloadForm) # ex. http://www.url-encode-decode.com/
checkMe := "payload=" + escaped