V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
EddieWang
V2EX  ›  程序员

有老哥懂 Java 和 node.js 嘛, help

  •  
  •   EddieWang · 2022-09-22 10:32:08 +08:00 · 1818 次点击
    这是一个创建于 816 天前的主题,其中的信息可能已经有所发展或是发生改变。

    hmac = crypto.createHmac('sha1', config.github.secret); hmac.update(JSON.stringify(payload)); calculatedSignature = 'sha1=' + hmac.digest('hex'); 这段 node.js 有老哥知道怎么写成 java 的嘛,我也去官网看了这段的说明,就说是加料实际上是咋运行的不太清楚(不搞 node.js ,不是很懂)我用 java 写了一下实际上的运行结果和这个段的不一样

    8 条回复    2022-09-22 16:13:29 +08:00
    Achieve7
        1
    Achieve7  
       2022-09-22 10:41:17 +08:00
    // 使用 sha1+salt 的方式创建一个加解密的句柄
    hmac = crypto.createHmac('sha1', config.github.secret)
    // 把解析成 json 字符串的 payload 传递给句柄
    hmac.update(JSON.stringify(payload))
    // 用 'sha1' 字符串拼接加密后的 16 进制字符串
    calculatedSignature = 'sha1=' + hmac.digest('hex')
    EddieWang
        2
    EddieWang  
    OP
       2022-09-22 10:56:35 +08:00
    我的理解就是:
    hmac = crypto.createHmac('sha1', config.github.secret)这段是对 secret 进行加密
    hmac.update(JSON.stringify(payload))只是把 payload 解析成字符串传递进去,这里的传递是 hmac 这样的拼接吗,主要就是不太理解这里的传递句柄大概是什么样
    hmac.digest('hex')最后把整个字符串解析成 16 进制的字符串?
    lmshl
        3
    lmshl  
       2022-09-22 11:21:42 +08:00
    crypto 也是流式计算的接口,比如你需要对整个文件计算 SHA1 的时候就需要分块读取并调用 update ,最后 digest 为 SHA1 摘要值。

    等价的 Java 代码应该是 javax.crypto.Mac.getInstance("HmacSHA256")
    lmshl
        4
    lmshl  
       2022-09-22 11:22:51 +08:00
    打错了,应该是 javax.crypto.Mac.getInstance("HmacSHA1")
    EddieWang
        5
    EddieWang  
    OP
       2022-09-22 11:39:19 +08:00
    crypto.createHmac('sha1', config.github.secret); 这个里面的 sercret 是怎么回事呢,我看了一下这个 javax.crypto.Mac.getInstance("HmacSHA1")里面除了 algorithm ,还提供了一个叫做 provider 的传参,这个传参我跟了一下是有固定值的,但是这个 sercret 是可以随意传的
    EddieWang
        6
    EddieWang  
    OP
       2022-09-22 15:37:13 +08:00
    相关实现:
    final SecretKeySpec secretKeySpec = new SecretKeySpec(str.getBytes(StandardCharsets.UTF_8),"HmacSHA1");
    final Mac hmac = Mac.getInstance("HmacSHA1");
    hmac.init(secretKeySpec);
    hmac.update(data.getBytes(StandardCharsets.UTF_8));
    byte[] result = hmac.doFinal();
    log.warn("sha1={}",byteArrToHex(result));
    lmshl
        7
    lmshl  
       2022-09-22 15:37:50 +08:00
    void init(Key key, AlgorithmParameterSpec params)
    Initializes this Mac object with the given key and algorithm parameters.
    @EddieWang
    EddieWang
        8
    EddieWang  
    OP
       2022-09-22 16:13:29 +08:00
    @lmshl 老哥谢啦 已经搞定了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   931 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 19:03 · PVG 03:03 · LAX 11:03 · JFK 14:03
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.