nodejs crypto и Crypto JS, дающие разные выходные данные base64 (sha256 (data)) - PullRequest
2 голосов
/ 26 мая 2020

У меня есть сервер узла и приложение, поддерживающее реакцию. На сервере узла вся криптография выполняется с помощью модуля crypto. В приложении, поддерживающем реакцию, вся криптография выполняется через библиотеку crypto-js, потому что crypto недоступен.

У меня есть этот пример кода на Repl.it - ​​https://repl.it/repls/UprightExtraneousDesigner#index. js

Скопировано, чтобы предотвратить распад ссылок:

const crypto = require("crypto");
const base64url = require("base64url");
const CryptoJS = require("crypto-js");

let publicKey = "6rjJnHqufRdGq7LxP6UyJEDbE84YRUKyZNYc27rUBqQZ";

const hash1 = crypto.createHash("sha256").update(Buffer.from(publicKey)).digest();
const hash2 = CryptoJS.SHA256(publicKey);

const kid1 = base64url.encode(hash1)

const kid2 = CryptoJS.enc.Base64.stringify(hash2);

console.log("KID1: ", kid1);
console.log("KID2: ", kid2);

Но по какой-то причине они дают мне немного разные результаты. Результат, который я получаю:

KID1:  qlm-6fOvD0F2qxOYDCvOkkohHfXL6nd_SpBDsBOWawE
KID2:  qlm+6fOvD0F2qxOYDCvOkkohHfXL6nd/SpBDsBOWawE=

Здесь есть три отличия:

  1. KID1 имеет - в индексе 3, тогда как KID2 имеет +
  2. KID1 имеет _ с индексом 31, тогда как KID2 имеет /
  3. KID1 не имеет заполнения, тогда как KID2 имеет заполнение в конце

Из-за расхождений здесь , У меня проблемы на моем сервере. Может кто-нибудь объяснить мне, почему это происходит и как я могу это исправить? Я думаю, это как-то связано с символами, используемыми в различных реализациях base64, но я не уверен, как это исправить.

Ответы [ 2 ]

2 голосов
/ 26 мая 2020

Выполните преобразование base64 с помощью инструментов, предоставляемых модулем Node.js crypto.

const hash1 = crypto.createHash("sha256").update(Buffer.from(publicKey)).digest('base64');
2 голосов
/ 26 мая 2020

base64url, как следует из названия, для URL-адресов.

Я почти уверен, что + преобразуется в -, потому что + в контексте URL-адресов означает «пробел», / преобразуется в _, потому что / является разделителем пути в URL-адресах и т. Д. c ..

Замена base64url модулем npm js-base64 и настройка кода следующим образом :

const jsbase = require("js-base64")

const kid1 = jsbase.Base64.encode(hash1)

Приводит к тому же результату, что и CryptoJS.enc.Base64.stringify.

...