果類型 CompactDecryptResult 全面解析)
網(wǎng)絡(luò)安全認(rèn)證鑒權(quán)后端【免費(fèi)下載鏈接】joseJWA, JWS, JWE, JWT, JWK, JWKS for Node.js, Browser, Cloudflare Workers, Deno, Bun, and other Web-interoperable runtimes項(xiàng)目地址https://gitcode.com/gh_mirrors/jo/jose點(diǎn)擊查看免費(fèi)下載CompactDecryptResult是 jose 庫中compactDecrypt()函數(shù)對緊湊序列化Compact SerializationJWE 解密成功后返回的結(jié)果對象類型它承載解密后的明文與受完整性保護(hù)的 JOSE 頭。本文以 CompactDecryptResult.md 為骨架結(jié)合src/jwe/compact/decrypt.ts、src/lib/jwe_decrypt.ts等源碼與測試深入講解該類型的每個(gè)字段、其產(chǎn)生過程、使用方式與底層解密流程幫助你在 Node.js、瀏覽器、Deno、Bun、Cloudflare Workers 等運(yùn)行時(shí)中正確消費(fèi)解密結(jié)果。一、CompactDecryptResult 是什么CompactDecryptResult是一個(gè) TypeScript 接口定義在 src/types.d.ts/** Compact JWE decryption result */ export interface CompactDecryptResult { /** Plaintext. */ plaintext: Uint8Array /** JWE Protected Header. */ protectedHeader: CompactJWEHeaderParameters }它是compactDecrypt()的返回值類型PromiseCompactDecryptResult同時(shí)也是 jose 公共 API 的一部分——從主入口jose與子路徑j(luò)ose/jwe/compact/decrypt均以命名導(dǎo)出的方式暴露見 src/index.ts 與 src/jwe/compact/decrypt.ts。與 Flattened扁平和 General通用序列化的解密結(jié)果不同Compact JWE 只使用受完整性保護(hù)的 Header即protected段因此結(jié)果中沒有sharedUnprotectedHeader、unprotectedHeader、additionalAuthenticatedData等可選字段字段結(jié)構(gòu)最簡潔只有plaintext和protectedHeader兩個(gè)成員。二、接口字段詳解plaintext解密后的明文類型Uint8Array語義通過內(nèi)容加密密鑰CEK對密文執(zhí)行認(rèn)證解密后得到的原始字節(jié)流。plaintext是Uint8Array而非字符串這是 jose 全庫一致的設(shè)計(jì)原則加密前的輸入也必須傳Uint8Array。拿到結(jié)果后通常需要借助TextDecoder將其還原為文本例如 compactDecrypt 函數(shù)文檔 中的示例const { plaintext, protectedHeader } await jose.compactDecrypt(jwe, privateKey) console.log(protectedHeader) console.log(new TextDecoder().decode(plaintext))若明文本身就是二進(jìn)制數(shù)據(jù)如密鑰、圖片字節(jié)、自定義序列化格式直接使用plaintext即可無需經(jīng)過字符串轉(zhuǎn)換。protectedHeaderJWE Protected Header類型CompactJWEHeaderParameters語義JWE 中受完整性保護(hù)的 Header 參數(shù)對象。在 Compact 序列化中它是唯一的 Header 載體alg與enc等關(guān)鍵參數(shù)全部從此解析。CompactJWEHeaderParameters的完整定義見 CompactJWEHeaderParameters.md其結(jié)構(gòu)要點(diǎn)如下參數(shù)類型必需說明algstring?JWE algAlgorithm密鑰管理算法頭參數(shù)encstring?JWE encEncryption Algorithm內(nèi)容加密算法頭參數(shù)critstring[]可選JWE critCritical關(guān)鍵頭參數(shù)ctystring可選ctyContent Type內(nèi)容類型頭參數(shù)jkustring可選jkuJWK Set URLJWK 集合地址頭參數(shù)jwkOmitJWK, d \| p \| q \| k \| dp \| dq \| qi \| priv \| oth可選jwkJSON Web Key頭參數(shù)僅允許公鑰私鑰與對稱密鑰參數(shù)被排除kidstring可選kidKey ID密鑰標(biāo)識(shí)頭參數(shù)typstring可選typType類型頭參數(shù)x5cstring[]可選x5cX.509 Certificate Chain證書鏈頭參數(shù)x5tstring可選x5tX.509 Certificate SHA-1 Thumbprint證書指紋頭參數(shù)x5ustring可選x5uX.509 URL證書地址頭參數(shù)zipstring可選JWE zipCompression Algorithm壓縮算法頭參數(shù)唯一支持值DEFDEFLATE且要求運(yùn)行時(shí)具備CompressionStream/DecompressionStreamAPI此外該接口帶索引簽名[propName: string]: unknown意味著任何其他未識(shí)別的 JWE Header 成員也可以出現(xiàn)在對象上類型層面不會(huì)阻止你讀取自定義頭參數(shù)。三、compactDecrypt 如何產(chǎn)出這個(gè)結(jié)果compactDecrypt()有三個(gè)重載見 src/jwe/compact/decrypt.ts返回結(jié)果隨調(diào)用方式略有差異直接傳密鑰compactDecrypt(jwe, key, options?)→PromiseCompactDecryptResult結(jié)果只有plaintext與protectedHeader傳密鑰解析函數(shù)compactDecryptKeyType(jwe, getKey, options?)→PromiseCompactDecryptResult ResolvedKeyKeyType結(jié)果在基礎(chǔ)字段之上額外攜帶key字段即最終解析出的實(shí)際解密密鑰轉(zhuǎn)發(fā)場景compactDecrypt(jwe, key, options?)接受密鑰或解析函數(shù)二選一返回CompactDecryptResult PartialResolvedKey——key僅在傳入解析函數(shù)時(shí)出現(xiàn)。實(shí)現(xiàn)層的關(guān)鍵代碼在 src/jwe/compact/decrypt.tsconst decrypted await decryptCompact(jwe, prepareDecrypt(options), key) const result { plaintext: decrypted[0], protectedHeader: decrypted[1]! } if (typeof key function) { return { ...result, key: decrypted[2] } } return result可見protectedHeader來自decryptCompact內(nèi)部解析出的parsedProtCompact 序列化下必然存在因此使用非空斷言!plaintext則是decryptRecipientCore完成認(rèn)證解密與可選解壓后的最終字節(jié)流。四、處理解密密文的實(shí)戰(zhàn)姿勢plaintext是二進(jìn)制字節(jié)常見的消費(fèi)方式有三種// 1. 還原為 UTF-8 文本 const text new TextDecoder().decode(result.plaintext) // 2. 還原為 JSON const payload JSON.parse(new TextDecoder().decode(result.plaintext)) // 3. 直接作為二進(jìn)制處理圖片、文件、密鑰材料等 const bytes result.plaintext // Uint8Array在 JWE 加密JWTJWE 序列化的 JWT的場景中解密結(jié)果中的明文就是 JWT Claims Set 的 JSON 字節(jié)可結(jié)合jwtDecrypt或手動(dòng)JSON.parse繼續(xù)消費(fèi)。測試 test/jwe/compact.decrypt.test.ts 展示了典型的加密→解密→比對閉環(huán)const jwe await new CompactEncrypt(plaintext) .setProtectedHeader({ alg: dir, enc: A128GCM }) .setInitializationVector(new Uint8Array(12)) .encrypt(secret) const result await compactDecrypt(new TextEncoder().encode(jwe), (protectedHeader, token) { // 解析函數(shù)中可以讀取 protectedHeader 與 token 成員動(dòng)態(tài)決定用哪把密鑰 return secret }) // 結(jié)果與原始明文逐字節(jié)相等 t.deepEqual(result.plaintext, plaintext) t.is(result.key, secret) // 使用解析函數(shù)時(shí)返回額外攜帶的 key五、結(jié)果中的 protectedHeader 值得關(guān)注的點(diǎn)解密成功后protectedHeader.alg與protectedHeader.enc就是實(shí)際生效的密鑰管理與內(nèi)容加密算法它們決定了整個(gè)解密路徑alg對應(yīng)密鑰管理算法dir、RSA-OAEP、RSA-OAEP-256、A128KW、ECDH-ES、ECDH-ESA128KW、PBES2-HS256A128KW等enc對應(yīng)內(nèi)容加密算法A128GCM、A192GCM、A256GCM、A128CBC-HS256、A192CBC-HS384、A256CBC-HS512等。在 cookbook/jwe.mjs 中可以找到各算法組合的官方 RFC 7520 互操作向量例如第 5.2 節(jié)RSA-OAEPA256GCM、第 5.6 節(jié)dirA128GCM、第 5.9 節(jié)帶zip: DEF壓縮等均包含可以直接驗(yàn)證的 Compact JWE 樣例字符串。若protectedHeader.zip DEF說明明文在加密前經(jīng)過了 DEFLATE 壓縮解密時(shí) jose 會(huì)自動(dòng)解壓見 src/lib/jwe_decrypt.ts此時(shí)plaintext是解壓后的最終明文你無需手動(dòng)處理。六、解密結(jié)果的底層產(chǎn)生流程從CompactDecryptResult的兩個(gè)字段出發(fā)可以順藤摸瓜看到 jose 完整的解密鏈路核心實(shí)現(xiàn)在 src/lib/jwe_decrypt.ts格式校驗(yàn)與切分decryptCompact將 Compact JWE 按.切分為 5 段protected、encrypted_key、iv、ciphertext、tag段數(shù)不為 5 時(shí)拋出JWEInvalidInvalid Compact JWEHeader 解析對protected段做 base64url 解碼與 JSON 解析得到parsedProt即結(jié)果中的protectedHeader來源算法校驗(yàn)decryptRecipientCore檢查alg、enc是否存在并通過crit、keyManagementAlgorithms、contentEncryptionAlgorithms等選項(xiàng)做白名單攔截命中限制時(shí)拋JOSEAlgNotAllowed見 src/lib/jwe_decrypt.ts密鑰管理與 CEK 恢復(fù)decryptKeyManagement按alg恢復(fù)內(nèi)容加密密鑰 CEK。值得注意的安全細(xì)節(jié)當(dāng)密鑰管理失敗時(shí)jose 依據(jù) RFC 7516 第 11.5 節(jié)替換為隨機(jī)生成的 CEK 繼續(xù)執(zhí)行避免區(qū)分格式、填充、長度錯(cuò)誤而引入時(shí)序攻擊見 src/lib/jwe_decrypt.ts內(nèi)容認(rèn)證解密decrypt()見 src/lib/content_encryption.ts按enc分發(fā)到 AES-GCMgcmDecrypt校驗(yàn) 128 位 tag 與 IV 長度或 AES-CBC HMACcbcDecrypt先常數(shù)時(shí)間比對 tag 再解密不匹配拋JWEDecryptionFailed可選解壓zip DEF時(shí)使用DecompressionStream解壓受maxDecompressedLength限制默認(rèn) 250 KB設(shè)為0拒絕一切壓縮 JWE設(shè)為Infinity關(guān)閉限制組裝結(jié)果{ plaintext, protectedHeader }返回若傳入解析函數(shù)則追加key。由此可以推斷protectedHeader的alg/enc值直接決定第 45 步走哪條密碼學(xué)路徑而plaintext是經(jīng)過完整認(rèn)證GCM tag 或 HMAC驗(yàn)證后的可信輸出——任何篡改都會(huì)在解密階段失敗并拋出JWEDecryptionFailed或JWEInvalid不會(huì)進(jìn)入結(jié)果對象。七、與 Flattened / General 解密結(jié)果的對比字段CompactDecryptResultFlattenedDecryptResult / GeneralDecryptResultplaintext? 必有? 必有protectedHeader? 必有CompactJWEHeaderParameters? 可選sharedUnprotectedHeader? 不存在? 可選unprotectedHeader? 不存在? 可選additionalAuthenticatedData? 不存在? 可選對比定義見 src/types.d.ts。Compact 序列化只有 5 段、單一收件人、無 AAD 與非保護(hù)頭因此結(jié)果接口刻意保持最小化這也是該類型在 TypeScript 層面承諾的字段一定存在、消費(fèi)時(shí)無需做可選判斷的原因。如果你需要處理多收件人、共享非保護(hù)頭或 AAD則應(yīng)使用flattenedDecrypt/generalDecrypt對應(yīng)的結(jié)果類型。八、相關(guān)文檔與進(jìn)一步閱讀compactDecrypt 函數(shù)文檔三個(gè)重載簽名、參數(shù)與返回值細(xì)節(jié)CompactJWEHeaderParameters.mdprotectedHeader字段的完整類型定義DecryptOptions.md解密選項(xiàng)keyManagementAlgorithms、contentEncryptionAlgorithms、crit、maxPBES2Count、maxDecompressedLength與 PBES2 默認(rèn)限制默認(rèn)p2c上限 10000KeyInput.mdkey參數(shù)可接受的密鑰輸入形式CryptoKey、KeyObject、Uint8Array、JWKtest/jwe/compact.decrypt.test.ts格式校驗(yàn)、成員解碼順序、解析函數(shù)與結(jié)果字段的單元測試cookbook/jwe.mjsRFC 7520 全量互操作向量可直接用于驗(yàn)證解密結(jié)果??偨Y(jié)CompactDecryptResult以最精簡的兩個(gè)字段——plaintext: Uint8Array與protectedHeader: CompactJWEHeaderParameters——完整封裝了 Compact JWE 解密的產(chǎn)出前者是經(jīng)過認(rèn)證解密必要時(shí)解壓后的可信明文后者是驅(qū)動(dòng)整個(gè)解密路徑的關(guān)鍵 Header 參數(shù)集合。理解它的字段語義、產(chǎn)生過程與底層校驗(yàn)鏈能讓你在 jose 中安全、正確地消費(fèi)各類 Compact JWE 解密結(jié)果無論是普通加密消息、壓縮內(nèi)容還是基于動(dòng)態(tài)密鑰解析函數(shù)的高并發(fā)場景。贊分享網(wǎng)絡(luò)安全認(rèn)證鑒權(quán)后端【免費(fèi)下載鏈接】joseJWA, JWS, JWE, JWT, JWK, JWKS for Node.js, Browser, Cloudflare Workers, Deno, Bun, and other Web-interoperable runtimes項(xiàng)目地址https://gitcode.com/gh_mirrors/jo/jose點(diǎn)擊查看免費(fèi)下載相關(guān)推薦Faker 日本媒體模塊實(shí)戰(zhàn)使用 Faker::JapaneseMedia::Doraemon 生成哆啦A夢主題假數(shù)據(jù)Faker 日本媒體模塊實(shí)戰(zhàn)使用 Faker::JapaneseMedia::Doraemon 生成哆啦A夢主題假數(shù)據(jù) 本指南圍繞 Faker 項(xiàng)目日本媒體網(wǎng)絡(luò)安全認(rèn)證鑒權(quán)后端KubeSphere 中的 Go JOSEgo-jose v2JWE / JWS / JWT 加密簽名庫深度解析KubeSphere 中的 Go JOSEgo jose v2JWE / JWS / JWT 加密簽名庫深度解析 本文以 KubeSphere 倉庫中 v后端云原生容器編排微服務(wù)Haystack Embedders 組件完全指南從 OpenAI 到 Sentence Transformers 的文本、文檔與稀疏向量嵌入Haystack Embedders 組件完全指南從 OpenAI 到 Sentence Transformers 的文本、文檔與稀疏向量嵌入 本文是 Hay網(wǎng)絡(luò)安全認(rèn)證鑒權(quán)后端上一篇Qwen3-14B-AWQ2025年大模型效率革命的輕量化標(biāo)桿下一篇create-react-native-app模板全解析3步打造個(gè)性化React Native項(xiàng)目創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考