簡體   English   中英

nodejs和kotlin中的SHA256不同的hash

[英]SHA256 different hash in nodejs and kotlin

我在兩個不同的模塊中使用 SHA 256 hash 生成器。 一個模塊用 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))
}

節點代碼

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: Base64.getUrlEncoder()提供的 urlencoded base64 引起的。

在 kotlin 你得到 base64 url 編碼,而在節點你只得到 Z95A1446A7120E4AFDC2 編碼。

也許這可以幫助您確定假設是否正確。 在節點添加 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"));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM