SHA256 разные га sh в nodejs и kotlin - PullRequest
3 голосов
/ 27 апреля 2020

Я использую генератор SHA 256 га sh в двух разных модулях. Один модуль написан на Kotlin, а другой - с использованием крипто API nodejs. Значение хэширования немного отличается в 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=. Я не мог определить, что я делаю не так?

Ответы [ 2 ]

1 голос
/ 27 апреля 2020

Вы должны использовать getEncoder() вместо getUrlEncoder() в своем коде kotlin.

Итак, вот фрагмент рабочего кода

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"));
1 голос
/ 27 апреля 2020

Я полагаю, что ваша проблема вызвана urlencoded base64, предоставленным kotlin: Base64.getUrlEncoder().

В kotlin вы кодируете url base64, тогда как на узле вы получаете только base64.

Может быть, это поможет вам определить, верно ли предположение. Добавьте кодировку URL на узле:

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


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