客户让我们提供一个 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
1
dasbn 2022-10-20 17:16:47 +08:00 1
前几天做过类似 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 |