如何解密经HKDF派生密钥的AES-GCM加密MSAL认证工件?
如何解密@azure/msal-browser v4版本加密的localStorage认证工件?
我的项目使用了@azure/msal-browser。此前存储在localStorage中的账户信息存在被利用的风险,v4版本中这一情况得到改善:
若使用localStorage作为缓存位置,认证工件将通过HKDF派生密钥,再以AES-GCM算法加密
我现在的问题是:如何解密这些认证工件?
我已获取以下信息:
- 从
msal.cache.encryption会话cookie中得到的原始密钥(示例:"E_WMCrIIYBWra4rBWM7yMNvVS8e5Rc_A8QyIhfchI2U") - 从localStorage中
someGuidA.someGuidB-login.windows.net-someGuidB项获取的加密数据(约6k长度的字符串) - 同样从上述localStorage项中获取的nonce(示例:"5DW6Kh6QWnp5Nlt8GWitVA")
我尝试了以下代码:
function toArrayBuffer(inputStr) { const len = inputStr.length; const bytes = new Uint8Array(len); for (var i = 0; i < len; i++) { bytes[i] = inputStr.charCodeAt(i); } return bytes.buffer; } async function getCryptoKey(inputRawKey) { const keyBuffer = toArrayBuffer(inputRawKey); return await window.crypto.subtle.importKey( "raw", keyBuffer, { name: "HKDF" }, false, ["deriveKey"] ); } async function decryptData(inputCryptoKey, inputData) { const encryptedArrayBuffer = toArrayBuffer(inputData); return await window.crypto.subtle.decrypt( { name: "AES-GCM", iv: encryptedArrayBuffer.slice(0, 12), tag: encryptedArrayBuffer.slice(-16), // authentication tag }, inputCryptoKey, encryptedArrayBuffer.slice(12, -16) ); } const cryptoKey = await getCryptoKey(rawKey); const res = await decryptData(cryptoKey, data); // fails
运行后出现如下错误:
Uncaught InvalidAccessError: key.algorithm does not match that of operation
这个错误逻辑通顺,我推测问题出在未正确还原HKDF派生密钥上——需要在getCryptoKey函数中同时结合"AES-GCM"和"HKDF"。另外,nonce显然要用于某个参数,可能是替换iv参数,但目前还没到这一步。
我已查阅以下资料:
- Web Cryptography API Examples
- How to C#.NET encrypt() then JS WebCryptoApi decrypt() using AES-GCM?
- Crypto Subtle Decrypt Parameter Not Type "CryptoKey"
内容的提问来源于stack exchange,提问作者fservantdev
相关产品推荐
相关产品推荐

