V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
sudoy
V2EX  ›  问与答

webhook 验证 nodejs hmac md5 加密问题

  •  
  •   sudoy · 2022-10-20 16:53:54 +08:00 · 666 次点击
    这是一个创建于 765 天前的主题,其中的信息可能已经有所发展或是发生改变。

    客户让我们提供一个 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

    3 条回复    2022-10-20 17:22:02 +08:00
    dasbn
        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
    dasbn
        2
    dasbn  
       2022-10-20 17:19:10 +08:00   ❤️ 1
    @dasbn 上面第一个 signature 就是别人计算出来的返回给你的签名,就是两边都进行签名一下,然后看是不是相同的
    sudoy
        3
    sudoy  
    OP
       2022-10-20 17:22:02 +08:00
    @dasbn 非常感谢! 我回头测试看
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   960 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 20:33 · PVG 04:33 · LAX 12:33 · JFK 15:33
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.