nodejs 和 kotlin 中的 SHA256 不同哈希
SHA256 different hash in nodejs and kotlin
我在两个不同的模块中使用 SHA 256 哈希生成器。一个模块是用 Kotlin 编写的,另一个使用 nodejs 加密 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=
,而 nodejs 代码输出 n4bQgYhMfWWaL+qgxVrQFaO/TxsrC4Is0V1sFbDwCgg=
。我无法确定我做错了什么?
我认为您的问题是由 kotlin 提供的 url 编码的 base64 引起的:Base64.getUrlEncoder()
.
在 kotlin 中,您得到的是 base64 url 编码,而在 node 中,您只有 base64。
也许这可以帮助您确定假设是否正确。
在节点处添加 url 编码:
// https://www.npmjs.com/package/base64url
const base64url = require('base64url');
console.log(base64url(crypto.createHash('sha256').update('test', 'utf8')));
您必须在您的 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"));
我在两个不同的模块中使用 SHA 256 哈希生成器。一个模块是用 Kotlin 编写的,另一个使用 nodejs 加密 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=
,而 nodejs 代码输出 n4bQgYhMfWWaL+qgxVrQFaO/TxsrC4Is0V1sFbDwCgg=
。我无法确定我做错了什么?
我认为您的问题是由 kotlin 提供的 url 编码的 base64 引起的:Base64.getUrlEncoder()
.
在 kotlin 中,您得到的是 base64 url 编码,而在 node 中,您只有 base64。
也许这可以帮助您确定假设是否正确。 在节点处添加 url 编码:
// https://www.npmjs.com/package/base64url
const base64url = require('base64url');
console.log(base64url(crypto.createHash('sha256').update('test', 'utf8')));
您必须在您的 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"));