nodejs crypto 和 CryptoJS 提供不同的 base64(sha256(data)) 输出
nodejs crypto and CryptoJS giving different base64(sha256(data)) outputs
我有一个节点服务器和一个反应本机应用程序。在节点服务器上,所有加密都是使用 crypto
模块完成的。在 react-native 应用程序上,所有加密都是通过 crypto-js
库完成的,因为 crypto
不可用。
我在 Repl.it - https://repl.it/repls/UprightExtraneousDesigner#index.js
上有这个示例代码
复制粘贴防止link衰减:
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=
这里有三个区别:
- KID1 在索引 3 处有一个
-
,而 KID2 有一个 +
- KID1 在索引 31 处有一个
_
,而 KID2 有一个 /
- KID1没有填充,而KID2最后有填充
由于此处的差异,我的服务器出现了问题。有人可以向我解释为什么会这样,我该如何解决?
我认为这与在不同的 base64 实现中使用的字符有关,但我不确定如何解决这个问题。
base64url
顾名思义,用于 URL。
我很确定 +
会转换为 -
,因为 +
在 URL 上下文中意味着 "space",/
会转换为 _
因为 /
是 URL 等中的路径分隔符..
用 npm 模块 js-base64
替换 base64url
并像这样调整代码:
const jsbase = require("js-base64")
const kid1 = jsbase.Base64.encode(hash1)
使其产生与CryptoJS.enc.Base64.stringify
相同的结果。
使用 Node.js crypto
模块提供的工具执行 base64
conversion。
const hash1 = crypto.createHash("sha256").update(Buffer.from(publicKey)).digest('base64');
我有一个节点服务器和一个反应本机应用程序。在节点服务器上,所有加密都是使用 crypto
模块完成的。在 react-native 应用程序上,所有加密都是通过 crypto-js
库完成的,因为 crypto
不可用。
我在 Repl.it - https://repl.it/repls/UprightExtraneousDesigner#index.js
上有这个示例代码复制粘贴防止link衰减:
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=
这里有三个区别:
- KID1 在索引 3 处有一个
-
,而 KID2 有一个+
- KID1 在索引 31 处有一个
_
,而 KID2 有一个/
- KID1没有填充,而KID2最后有填充
由于此处的差异,我的服务器出现了问题。有人可以向我解释为什么会这样,我该如何解决? 我认为这与在不同的 base64 实现中使用的字符有关,但我不确定如何解决这个问题。
base64url
顾名思义,用于 URL。
我很确定 +
会转换为 -
,因为 +
在 URL 上下文中意味着 "space",/
会转换为 _
因为 /
是 URL 等中的路径分隔符..
用 npm 模块 js-base64
替换 base64url
并像这样调整代码:
const jsbase = require("js-base64")
const kid1 = jsbase.Base64.encode(hash1)
使其产生与CryptoJS.enc.Base64.stringify
相同的结果。
使用 Node.js crypto
模块提供的工具执行 base64
conversion。
const hash1 = crypto.createHash("sha256").update(Buffer.from(publicKey)).digest('base64');