Javascript HMAC签名不';t匹配来自github的x-hub签名
我正在处理从github传入的Webhook,并希望验证x-hub签名。我使用Javascript HMAC签名不';t匹配来自github的x-hub签名,javascript,node.js,cryptography,webhooks,hmac,Javascript,Node.js,Cryptography,Webhooks,Hmac,我正在处理从github传入的Webhook,并希望验证x-hub签名。我使用hmac对“secret”进行散列,然后比较两个散列。问题是他们从不匹配。这是我的设置: router.route("/auth") .post((req, res) => { var hmac = crypto.createHmac("sha1", process.env.WEBHOOK_SECRET); var calculatedSignature = "sha1=" + hmac.up
hmac
对“secret”进行散列,然后比较两个散列。问题是他们从不匹配。这是我的设置:
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)
。有人知道为什么它们不匹配吗?所以问题在于webhook的设置。内容格式设置为application/x-www-form-urlencoded,出于某种原因,它对x-hub-signature进行了不同的散列。我刚把它改成application/json,然后它就工作了 如果webhook内容类型设置为application/x-www-url-encoded
,则需要使用该字符串检查HMAC是否正确
“payload=“+query\u encoded\u payload
例如在戈兰
payloadForm := r.PostFormValue("payload")
escaped := url.QueryEscape(payloadForm) # ex. http://www.url-encode-decode.com/
checkMe := "payload=" + escaped
您是从哪里更改内容格式的?我找不到任何方法来设置这个webhook的设置。这对我很有效!非常感谢@snl您可以在github.com上的存储库设置webhooks下更改内容格式。