webhook 验证 nodejs hmac md5 加密问题

2022-10-20 16:53:54 +08:00
 sudoy

客户让我们提供一个 webhook 地址,用来接收事件推送。然后关于 webhook 加密,对方给了个密钥。推送过来的 body 是 json ,头文件里面有个签名。让我们自己用密钥把 json 加密计算出 HEX digest, 和签名进行比对,以验证发送方。

关于加密,他说是用 HMAC MD5 加密。我琢磨半天也搞不明白,对加密很菜鸡。哪位大佬帮忙指点一下。不胜感激!

对了,我们服务器用的是 nodejs 运行时。

看了这个帖子,但是没有看到怎么把密钥放进去计算 https://stackoverflow.com/questions/63397714/not-able-to-create-md5-hash-on-cloudflare-worker-script

575 次点击
所在节点    问与答
3 条回复
dasbn
2022-10-20 17:16:47 +08:00
前几天做过类似 GitHub 的 webhook , 如果是 HMAC MD5 加密,还得看是不是 sha256 ,
当时我的比较是这样的 :
```js
function compareSignatures(signature, rawBody, secretKey) {
const computedSignature = crypto.createHmac("sha256", secretKey)
.update(rawBody)
.digest("hex");
const hexSignature = signature.slice("sha256=".length);

const sig = Buffer.from(hexSignature, "utf8");
const digest = Buffer.from(computedSignature, "utf8");

return sig.length === digest.length && timingSafeEqual(digest, sig);
}
```

rawBody 就是你的 JSON body ,一定是不能转化的,express 有插件自动转化了,,secretKey 就是你自己设置的一串 Key ,生成的字段是类似 "fdaasdsa" 就是签名后面的一段"sha256=" 后面的一段,采用 Buffer 安全的比较,,当然我也是找的晚上的改了,

不行就参考 GitHub 的手册,很全面就是用的 ruby 语言示例:
https://docs.github.com/en/developers/webhooks-and-events/webhooks/securing-your-webhooks#validating-payloads-from-github
dasbn
2022-10-20 17:19:10 +08:00
@dasbn 上面第一个 signature 就是别人计算出来的返回给你的签名,就是两边都进行签名一下,然后看是不是相同的
sudoy
2022-10-20 17:22:02 +08:00
@dasbn 非常感谢! 我回头测试看

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/888478

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX