我有以下代碼:
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 生成器進行驗證,例如這個)。我猜我在這里做錯了什么,但我看不到。我閱讀了檔案并找不到任何東西。
如果有幫助,我已經準備了一個小密碼箱。
uj5u.com熱心網友回復:
您所遇到的與 CryptoJS 包有關,因為我看到您在代碼箱示例中使用了crypto-js/enc-base64url。
CryptoJS 中的物件是 WordArray 型別,這意味著當您對此類物件呼叫toString()時,您將獲得該二進制物件的十六進制編碼字串。但是,如果您列印,result.toString(CryptoJS.enc.Base64)那么您將獲得二進制結果的 Base64 編碼字串。
如果您將分配的變數直接編碼為Base64,則可能假定 a 已經是一個字串(例如 UTF-8 編碼)。您用于驗證的在線計算器不知道它是十六進制編碼的。
我希望這能回答你的問題。
uj5u.com熱心網友回復:
所以在搜索了更多之后,這就是我所做的:
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)!
uj5u.com熱心網友回復:
由于您想要哈希的 base64 編碼十六進制字串,而 crypto-js 庫的 base64 編碼器不接受字串,您可以使用btoa.
btoa(hashed.toString())
但是,如果您確實需要 Base64url 變體,則可能不是您想要的。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/490879.html
標籤:javascript 打字稿 密码
上一篇:為什么會出現這個無限回圈?
