繁体   English   中英

CryptoJs SHA256 到 Base64url 错误值

[英]CryptoJs SHA256 to Base64url wrong value

我有以下代码:

import Base64url from "crypto-js/enc-base64url"
import SHA256 from "crypto-js/sha256";

//... 

const codeVerifier = "test-value";
const hashed = SHA256(codeVerifier);


console.log({ sha256: hashed.toString() });
// output: sha256: 5b1406fffc9de5537eb35a845kc99521f26fba0e772d58b42e09f4221b9e043ae

console.log({ base64: Base64url.stringify(hashed) })
// output: base64: WxQG__yd5VN-s1qEXJlSHyb7oOdy1YtC4J9CIbngQ64

// expected: base64: NWIxNDA2ZmZmYzlkZTU1MzdlYjM1YTg0NWM5OTUyMWYyNmZiYTBlNzcyZDU4YjQyZTA5ZjQyMjFiOWUwNDNhZQ

如您所见,我得到的输出不正确(我使用在线 base64url 生成器进行验证,例如这个)。 我猜我在这里做错了什么,但我看不到。 我阅读了文档并找不到任何东西。

如果有帮助,我已经准备了一个小 密码箱

您所遇到的与 CryptoJS 包有关,因为我看到您在代码箱示例中使用了crypto-js/enc-base64url

CryptoJS 中的对象是 WordArray 类型,这意味着当您对此类对象调用toString()时,您将获得该二进制对象的十六进制编码字符串。 但是,如果您打印result.toString(CryptoJS.enc.Base64)那么您将获得二进制结果的 Base64 编码字符串。

如果您将分配的变量直接编码为Base64 ,则可能假定 a 已经是一个字符串(例如 UTF-8 编码)。 您用于验证的在线计算器不知道它是十六进制编码的。

我希望这能回答你的问题。

所以在搜索了更多之后,这就是我所做的:

const codeVerifier = "test-value";
const hashed = SHA256(codeVerifier);

// parse to utf-8-encoded data
const utf8parsed = Utf8.parse(hashed.toString());

console.log({ sha256: hashed.toString() });
// output: sha256: 5b1406fffc9de5537eb35a845kc99521f26fba0e772d58b42e09f4221b9e043ae

console.log({ base64: Base64url.stringify(utf8parsed) });
// correct output!

感谢其他帮助过的人(@ZombieChowder)!

由于您想要 hash 的 base64 编码的十六进制字符串,而 crypto-js 库的 base64 编码器不接受字符串,您可以使用btoa

btoa(hashed.toString())

但是,如果您确实需要 Base64url 变体,则可能不是您想要的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM