D-20260808-06|多身分封存與加密本機備份¶
背景與驅動力¶
同一 origin 原本只允許單一 profile,blocklist、recent teammates、車庫與 Inbox 本機資料也沒有 per-identity namespace;本機測試 GLB 更是無法由網路重建。D-20260704-03 在域名遷移情境下曾裁定 不提供 origin storage 匯出工具,但當時未納入多 profile、sealed identity container 與本機 Editor 成品的完整需求。專案尚未首次公開,可直接採最佳結構而不背負舊公開 schema 相容層。
考慮過的選項¶
- 維持單一 profile、只靠各身分備份碼與手動 GLB:身分資料與裝置設定仍會遺失,否決。
- 另做未加密 JSON/整包記憶體 Blob:會暴露本機資料且無法安全處理 80 MiB GLB,否決。
- 同 origin 多 profile、全 origin 單一 active identity、per-identity sealed container,加密串流 CAR 備份(採納)。
決定¶
- 同一 origin 可保存多個 profile,但任何時刻只允許一個 active identity。切換前必須先廣播撤銷、 停止舊 app generation、房間/賽事/P2P、清 TURN 與明文工作集,再解鎖新 profile;跨分頁以 durable activation envelope 競爭並讀回確認唯一 winner。
open4wd-keysschema 2 以profiles與identity-containers分 store。身分層各 domain 從 master seed 以 HKDF-SHA256 派生獨立 AES-GCM key,絕不從 PIN 派生;換 PIN 不重加密 container。刪除 profile 必須在同一 IndexedDB transaction 同時刪除其 container。- 單一本機備份格式為
.open4wd-backup:外層標準 CAR v1,最小明文 envelope 只含格式版、 Argon2id 參數、salt、header IV 與 encrypted-header CID;密碼至少 12 個 Unicode code point,預設 Argon2id 64 MiB/3 iter/4 lane。內層也是 CAR v1,root 為選擇 manifest,本機 GLB 為 raw block。 - payload 固定有界分塊並各自使用獨立 IV/AES-GCM;AAD 綁 backup id、schema、chunk index/total 與 plaintext length,encrypted header 綁有序 CID 清單。匯入先完整驗證 outer/inner CAR、CID、AEAD、 exact keys、版本與尺寸帽,之後才進正式 store。
- 匯出可多選身分 sealed portable domains、設定分類與個別本機資產。助記詞/備份碼、private key、
encryptedSeed、TURN secret、鏈上 UGC bytes、ledger、cache、Inbox snapshot/outbox 永不入包;network 設定另剝除turnCredentialRef。備份包不是帳號備份,恢復每個 PeerId 仍需自己的備份碼。 - 匯入以身分、設定分類與資產為提交分段:同 PeerId 的 portable domains 取代、衍生 snapshot 保留; 本機較新資料先警示、先估 quota;每個 GLB 重新走 Sanitize Worker、Wave A 與 canonical 收件規則, 壞資產只拒絕該段。覆寫 active identity 前必須先撤銷 session。
- 大檔輸出順序為 File System Access 直接串流、OPFS 暫存後援、最後才是有硬上限的記憶體路徑;不得 將無界整包聚合成單一 Blob。backup schema v1 與首次公開 builtin asset v1 是互不相關的版本軸。
後果與影響¶
本決策只修正 D-20260704-03「不做 origin storage 匯出工具」的部分;域名不綁識別子、301 herding
與其他遷移程序不變。D-20260803-05 的 exact-root UGC CAR 仍是鏈上 CID 保存/補回路徑,與本機資料
.open4wd-backup 不合併;editable GLB 出口也維持獨立用途。代價是 key store schema、登入生命週期、
設定維護 UI 與匯入驗證面增加,但在首次公開前完成,無公開使用者相容成本。