nodejs crypto和CryptoJS提供不同的base64(sha256(data))输出

问题描述 投票:1回答:2

我有一个节点服务器和一个本机应用程序。在节点服务器上,所有加密均使用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在索引31中具有/
  3. [KID1没有填充,而KID2在末尾有填充

由于这里的差异,我的服务器出现问题。有人可以向我解释为什么会发生这种情况,我该如何解决?我认为这与在不同的base64实现中使用的字符有关,但我不确定如何解决。

javascript node.js cryptojs base64url
2个回答
0
投票

base64url顾名思义,用于URL。

[我很确定+被转换为-,因为[URL中的+表示“空格”,/被转换为_,因为/是URL中的路径分隔符,等等。 ..

用npm模块base64url替换js-base64并像这样调整代码:

const jsbase = require("js-base64")

const kid1 = jsbase.Base64.encode(hash1)

给出与CryptoJS.enc.Base64.stringify相同的结果。


0
投票

使用Node.js base64模块提供的工具进行crypto转换。

const hash1 = crypto.createHash("sha256").update(Buffer.from(publicKey)).digest('base64');
© www.soinside.com 2019 - 2024. All rights reserved.