【问题标题】:nodejs crypto and CryptoJS giving different base64(sha256(data)) outputsnodejs crypto 和 CryptoJS 提供不同的 base64(sha256(data)) 输出
【发布时间】:2020-05-25 23:31:54
【问题描述】:

我有一个节点服务器和一个 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 在索引 31 处有一个 _,而 KID2 有一个 /
  3. KID1 没有填充,而 KID2 在末尾有填充

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

【问题讨论】:

    标签: javascript node.js cryptojs base64url


    【解决方案1】:

    base64url,顾名思义,用于 URL。

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

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

    const jsbase = require("js-base64")
    
    const kid1 = jsbase.Base64.encode(hash1)
    

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

    【讨论】:

    • 哇.. 我从来不知道两者之间有区别。我给了你一个赞成票,但我会接受另一个答案,因为它可以在不使用更多库的情况下解决这个问题。
    【解决方案2】:

    使用 Node.js crypto 模块提供的工具执行base64 conversion

    const hash1 = crypto.createHash("sha256").update(Buffer.from(publicKey)).digest('base64');
    

    【讨论】:

    • 谢谢!!一旦计时器消失,将接受您的回答
    猜你喜欢
    • 1970-01-01
    • 2023-02-23
    • 2021-09-02
    • 2013-07-29
    • 1970-01-01
    • 2014-01-14
    • 2020-05-28
    • 2020-12-16
    • 1970-01-01
    相关资源
    最近更新 更多