3

我有一个节点服务器和一个 react-native 应用程序。在节点服务器上,所有加密都是使用该crypto模块完成的。在 react-native 应用程序上,所有加密都是通过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 有一个_at 索引 31,而 KID2 有一个/
  3. KID1 没有填充,而 KID2 在末尾有填充

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

4

2 回答 2

4

base64url顾名思义,是用于 URL。

我很确定+会被转换为,-因为+在 URL 的上下文中意味着“空格”,因为是 URL 等中的路径分隔符而/被转换为。_/

替换base64url为 npm 模块js-base64并调整代码如下:

const jsbase = require("js-base64")

const kid1 = jsbase.Base64.encode(hash1)

使其产生与 相同的结果CryptoJS.enc.Base64.stringify

于 2020-05-25T23:40:00.413 回答
3

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

const hash1 = crypto.createHash("sha256").update(Buffer.from(publicKey)).digest('base64');
于 2020-05-25T23:40:06.920 回答