hmac = crypto.createHmac('sha1', config.github.secret); hmac.update(JSON.stringify(payload)); calculatedSignature = 'sha1=' + hmac.digest('hex'); 这段 node.js 有老哥知道怎么写成 java 的嘛,我也去官网看了这段的说明,就说是加料实际上是咋运行的不太清楚(不搞 node.js ,不是很懂)我用 java 写了一下实际上的运行结果和这个段的不一样
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') |
2
EddieWang OP 我的理解就是:
hmac = crypto.createHmac('sha1', config.github.secret)这段是对 secret 进行加密 hmac.update(JSON.stringify(payload))只是把 payload 解析成字符串传递进去,这里的传递是 hmac 这样的拼接吗,主要就是不太理解这里的传递句柄大概是什么样 hmac.digest('hex')最后把整个字符串解析成 16 进制的字符串? |
3
lmshl 2022-09-22 11:21:42 +08:00
crypto 也是流式计算的接口,比如你需要对整个文件计算 SHA1 的时候就需要分块读取并调用 update ,最后 digest 为 SHA1 摘要值。
等价的 Java 代码应该是 javax.crypto.Mac.getInstance("HmacSHA256") |
4
lmshl 2022-09-22 11:22:51 +08:00
打错了,应该是 javax.crypto.Mac.getInstance("HmacSHA1")
|
5
EddieWang OP crypto.createHmac('sha1', config.github.secret); 这个里面的 sercret 是怎么回事呢,我看了一下这个 javax.crypto.Mac.getInstance("HmacSHA1")里面除了 algorithm ,还提供了一个叫做 provider 的传参,这个传参我跟了一下是有固定值的,但是这个 sercret 是可以随意传的
|
6
EddieWang OP 相关实现:
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)); |