我有一个节点服务器和一个本机应用程序。在节点服务器上,所有加密均使用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=
这里有三个区别:
-
,而KID2的索引为+
_
,而KID2在索引31中具有/
由于这里的差异,我的服务器出现问题。有人可以向我解释为什么会发生这种情况,我该如何解决?我认为这与在不同的base64实现中使用的字符有关,但我不确定如何解决。
base64url
顾名思义,用于URL。
[我很确定+
被转换为-
,因为[URL中的+
表示“空格”,/
被转换为_
,因为/
是URL中的路径分隔符,等等。 ..
用npm模块base64url
替换js-base64
并像这样调整代码:
const jsbase = require("js-base64")
const kid1 = jsbase.Base64.encode(hash1)
给出与CryptoJS.enc.Base64.stringify
相同的结果。
使用Node.js base64
模块提供的工具进行crypto
转换。
const hash1 = crypto.createHash("sha256").update(Buffer.from(publicKey)).digest('base64');