2 votes

Conversion du cryptage Scala hmacSHA256 en crypto Nodejs

J'ai cette méthode d'encryptage en Scala, que je veux convertir en NodeJS pour un microservice :

val key = "very-secret-key"
val id1 = "1001"
val id2 = "2002"
val id3 = "3003"

val mac = Mac.getInstance("hmacSHA256")
mac.init(new SecretKeySpec(key.getBytes, "hmacSHA256"))
val digest = mac.doFinal(id1.getBytes ++ id2.getBytes ++ id3.getBytes)

new String(UrlBase64.encode(digest)).replace(".", "")

a essayé de le faire avec createHmac de crypto et en convertissant en octets avec Buffer mais le jeton de sortie n'est pas le même que celui que j'ai généré en Java

import { createHmac } from 'crypto';

const id1 = Buffer.from('1001', 'base64');
const id2 = Buffer.from('2002', 'base64');
const id3 = Buffer.from('3003', 'base64');

const buffer = Buffer.from("very-secret-key", 'base64');
const token = createHmac('sha256', buffer).digest('base64').replace('.', '');

Je ne sais pas comment ajouter les octets de la mémoire tampon au jeton. mac.doFinal(id1.getBytes ++ id2.getBytes ++ id3.getBytes)

2voto

Topaco Points 3235

L'encodage de id1 , id2 , id3 y buffer / key diffère dans les deux codes. Dans le code Scala, l'élément getBytes est appliquée, qui utilise l'encodage par défaut de la plate-forme. Dans le code NodeJS, le même encodage doit être appliqué au lieu de Base64.
Par exemple, en supposant que l'encodage par défaut de la plate-forme dans l'environnement Java est UTF-8 :

const id1 = Buffer.from('1001', 'utf8');
const id2 = Buffer.from('2002', 'utf8');
const id3 = Buffer.from('3003', 'utf8');
const buffer = Buffer.from("very-secret-key", 'utf8');

En outre, le code NodeJS ne contient pas l'élément update() qui transmettent le id1 , id2 y id3 données. En outre, pour l'encodage du HMAC, Base64url doit être utilisé au lieu de Base64 pour être compatible avec le code Scala :

const token = crypto.createHmac('sha256', buffer)
  .update(id1)
  .update(id2)
  .update(id3)
  .digest('base64url');

Puisque l'alphabet Base64url ne contient pas de . , le replace('.', '') n'est en fait pas nécessaire (ni dans le code Scala, ni dans le code NodeJS).

Avec ces modifications, les deux codes renvoient le même HMAC pour les mêmes données d'entrée, par exemple pour les données d'entrée affichées B5WtlMrLxvMMcDqxOls0-qxqGW2bbaOanXLE7RaXAbA (en supposant que l'encodage par défaut de la plate-forme dans l'environnement Java est UTF-8).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X