在Node.js和Kotlin中,SHA256哈希不同

6

我在两个不同的模块中使用SHA 256哈希生成器。一个模块是用Kotlin编写的,另一个模块使用nodejs crypto API编写。在Nodejs和Kotlin中,哈希值略有不同。

Kotlin代码:

import java.security.MessageDigest
import java.util.Base64
fun main() {
        val md = MessageDigest.getInstance("SHA-256")
        val input = "test".toByteArray(Charsets.UTF_8)
        val bytes = md.digest(input)
        println(Base64.getUrlEncoder().encodeToString(bytes))
}

Nodejs 代码

const crypto = require('crypto');
const hash = crypto.createHash('sha256');

hash.update('test');
console.log(crypto.createHash('sha256').update('test', 'utf8').digest('base64'));

这段 Kotlin 代码输出 n4bQgYhMfWWaL-qgxVrQFaO_TxsrC4Is0V1sFbDwCgg=,而 Node.js 代码输出 n4bQgYhMfWWaL+qgxVrQFaO/TxsrC4Is0V1sFbDwCgg=。我无法确定我做错了什么?

2个回答

2

我相信你的问题是由kotlin提供的urlencoded base64引起的:Base64.getUrlEncoder()

在kotlin中,你得到的是base64 url编码,而在node中你只获得了base64。

也许这可以帮助你确定假设是否正确。 在node中添加url编码:

// https://www.npmjs.com/package/base64url


const base64url = require('base64url');
console.log(base64url(crypto.createHash('sha256').update('test', 'utf8')));

它差不多成功了。现在我用node得到的输出是n4bQgYhMfWWaL-qgxVrQFaO_TxsrC4Is0V1sFbDwCgg,而用kotlin得到的输出是n4bQgYhMfWWaL-qgxVrQFaO_TxsrC4Is0V1sFbDwCgg=。在node版本中缺少了等号。我会继续调查。非常感谢。 - jsamire
1
= 是 Java/Kotlin 无论输入字符串都会添加的内容。我可能会为节点版本附加 =。我将继续查找 = 的原因。 - jsamire
"="是填充值。不深入技术细节,它用作填充。如果您的实现考虑了填充,则会在输出中放置一个或两个"="以获得正确的长度。 - catastrophic error

1

在你的 Kotlin 代码中,你需要使用 getEncoder() 而不是 getUrlEncoder()

以下是可用的代码片段:

import java.security.MessageDigest
import java.util.Base64

fun main() {  
    val md = MessageDigest.getInstance("SHA-256")
    val input = "test".toByteArray()
    val bytes = md.digest(input)
    println(Base64.getEncoder().encodeToString(bytes))
}

而对于NodeJS

const crypto = require('crypto');

const generateSignature = (body) => {
  const payload = body;
  const signature = crypto.createHash('sha256').update(payload).digest('base64')
  return signature;
}

console.log(generateSignature("test"));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接