J'utilise un générateur de hachage SHA 256 dans deux modules différents. Un module est écrit en Kotlin et l'autre en utilisant l'API crypto nodejs. La valeur hachée est légèrement différente dans nodejs et kotlin.

Code 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))
}

Code Nodejs

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

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

Le code kotlin renvoie n4bQgYhMfWWaL-qgxVrQFaO_TxsrC4Is0V1sFbDwCgg= où comme le code nodejs sort n4bQgYhMfWWaL+qgxVrQFaO/TxsrC4Is0V1sFbDwCgg=. Je n'ai pas pu identifier ce que je fais mal?

4
jsamire 27 avril 2020 à 21:07

2 réponses

Meilleure réponse

Je pense que votre problème est causé par le code url base64 fourni par kotlin: Base64.getUrlEncoder().

Dans kotlin, vous obtenez l'URL en base64 codée, alors qu'au nœud, vous n'avez que base64.

Peut-être que cela vous aide à déterminer si l'hypothèse est correcte. Ajoutez le codage d'url au nœud:

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


const base64url = require('base64url');
console.log(base64url(crypto.createHash('sha256').update('test', 'utf8')));
2
gcleite 27 avril 2020 à 18:13

Vous devez utiliser getEncoder() au lieu de getUrlEncoder() dans votre code kotlin.

Voici donc l'extrait de code de travail

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))
}

Et pour 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
Manoj 27 avril 2020 à 18:44