FR-169 · 需求索引 · 本頁由 build 掃資料夾生成

FR-169 下載檔加密

已收尾(2026-10-29 母卡 CM-3223 與十二張子卡 Done);四 repo 已 push 到 feature/FR-139;STG/POC 未上、Agent image 未出包

狀態:詳見下方 文件 2 份 handoff 2 份
§1

🔴 先看哪一份

文件 性質 看什麼
討論稿 需求與待裁 為什麼要做、D1~D8 待裁、現況盤點
互動雛形 畫面 匯出對話框三種樣子、安全政策新增段、Agent 離線下載、稽核事件
取捨分析 設計理由 八個方案為何只留一個、系統產密碼的已知漏洞與驗收條件
§2

結論

  • 下載下來的 Word、Excel、PDF 用檔案格式內建的開啟密碼;多檔、圖片、log 打成 AES-256 加密 zip(檔名看得到、內容要密碼;內建解壓打不開,要 7-Zip/WinZip/Keka)。Word、Excel、PDF 不裝軟體;不寄信。
  • 密碼由系統在下載時產生、畫面只顯示一次、不存、不重寄;忘了就重新匯出。
  • 加密寫成獨立小套件 jedi-file-protect(0.2.1 已發版),主系統與 Agent 各自接,Agent 離線照常。
  • 線上預覽不改造,但 PDF 預覽把瀏覽器內建檢視器的下載/列印工具列藏掉、列印印空白——有預覽權的人不能從預覽框拿到沒密碼的檔;擋不住右鍵與 Ctrl+S,要全擋得走 pdf.js 自繪(未排)。
  • 使用者永遠不能選「不加密」。管理員在安全政策有一個開關、預設開;關閉會寫稽核事件,系統管理員全站頂部有常駐橫幅,之後每筆下載的稽核紀錄記 encrypted=false。「畫面上標未加密」這道決策者裁示拿掉(系統沒有稽核事件頁,稽核只出到診斷包與 log 轉發)。
  • 決策者指定不加密的三類:責任分工設定、控制項對照、任務批次匯出(要離線改再匯回,匯入端讀不了加密檔),照樣記下載稽核。
  • 上傳檔(證據附件、程序書、前置資料、問卷與意見回饋附件)的下載與匯出報表走同一條出口:jedi-file-upload 的下載 route 在檔案出門前交給主系統加密+稽核;前端不再用簽票開新分頁(那條帶不了密碼)。操作日誌、意見回饋、任務批次三支套件自帶的匯出也用同一個掛點接上。
  • 像但不做:IRM/DRM/撤銷/到期(決策者裁示先不做)、使用者自訂密碼、寄信送密碼、「使用者可選」模式、線上預覽器改造。
§3

📊 總進度

母卡 CM-3223。批 1~5 八張卡 2026-10-29 全部由工作坊首腦驗到「驗收通過待確認」,母卡層總驗通過;成果在四個 repo 的工作區 .worktrees/CM-3223(branch ws-CM-3223),合回 feature/FR-139 由決策者在工作坊按「合回」。三支套件同日發版:jedi-file-protect 0.1.0 首發、jedi-iam 1.10.0、jedi-masking 0.1.1;BE 已釘版(34206718e)、Agent 工作區已補相依(4df889e)。總驗抓到三個缺口開成批 6 兩張補卡,同日驗收通過並合回。四個 repo 的 ws-CM-3223 已全部合進 feature/FR-139(ws 領先 0)。

卡 Notion 做什麼 狀態
P1 CM-3224 新套件 jedi-file-protect:產密碼、PDF/Office/7z 三種加密、PDF ✅ 首腦驗收通過
B1 CM-3225 主系統:出檔前保護 helper、安全政策開關 FILE_DOWNLOAD_PROTECTION ✅ 首腦驗收通過
F1 CM-3226 主站共用 composable useProtectedDownload +「密碼只顯示一次」對 ✅ 首腦驗收通過
B2 CM-3227 主系統其餘匯出端點全部改走 send_protected(SSP、控制項對照、RACI、風險登錄 ✅ 首腦驗收通過
F2 CM-3228 主站其餘 24 處下載全部改走 useProtectedDownload(service 層 b ✅ 首腦驗收通過
A1 CM-3229 Agent 主控台:檔案與報告下載走 jedi-file-protect、心跳收 file_pr ✅ 首腦驗收通過
F3 CM-3230 Agent 主控台前端:檔案頁、執行紀錄、診斷包下載接 ProtectedDownloadDia ✅ 首腦驗收通過
D1 CM-3231 文件:SPEC 頁(匯出類頁面各加一段「下載會加密」、安全政策頁)、使用手冊「如何開啟加密檔」、 ✅ 首腦驗收通過
B3 CM-3280 Agent 下載稽核的 encrypted 欄進主系統白名單;SPEC/手冊補回總覽警示與未加密標記 ✅ 首腦驗收通過
F4 CM-3281 全站頂部「檔案下載保護已關閉」常駐橫幅(系統管理員)+稽核頁每筆下載標「未加密」 ✅ 首腦驗收通過
— (首腦直修) 上傳檔下載(證據、程序書、前置資料、問卷與意見回饋附件)接 send_protected:jedi-file-upload 1.5.0 加 download_responder 掛點、BE 注入、FE 12 處改走 useProtectedDownload、簽票明文路徑刪除 ✅ 已合回
P2 CM-3286 jedi-log 操作日誌匯出、jedi-issue 意見回饋匯出、jedi-task-platform 任務批次匯出三支套件加同樣掛點;三支已發版 ✅ Done
B4 CM-3287 主系統注入三支 responder、釘版;FE 三處早已走 useProtectedDownload 不用改 ✅ Done
§4

需求討論紀錄

  • 2026-10-29 決策者:威脅是「檔案下載後別人走到我電腦雙擊就能開」;工研院那種要裝解密軟體太麻煩。
  • 2026-10-29 決策者:先不做撤銷。IRM/DRM 整條排除。
  • 2026-10-29 決策者:不要使用者自訂密碼,問有沒有一次性驗證那種;定案為系統產生、畫面顯示一次。
  • 2026-10-29 決策者:擔心 Agent 離線寄不了信要搬通知模組;確認密碼只走畫面不寄信後不需要。
  • 2026-10-29 決策者:加密函式放哪?定案獨立套件,不放 jedi-file-upload、不塞 jedi-common。
  • 2026-10-29 決策者看雛形:不要有「未加密下載」的選項。D5 撤銷。
  • 2026-10-29 決策者「都照建議,落 design 開卡」:D1~D8 全照建議定案,母卡 CM-3223、子卡 CM-3224~3231。
  • 2026-10-29 決策者問要不要讓 user 選、業界怎麼做、PM 意思是都要加密;重新分析後定案:使用者不選、管理員開關預設開、關閉有三道警示(e2e/教育訓練、客戶既有 DLP、匯出餵別系統三種情境要有正規出口)。
  • 2026-10-29 決策者「好像都好了你驗收一下,可以的話就發套件版本」:首腦母卡層總驗八張卡全過;三支套件發版(jedi-file-protect 0.1.0、jedi-iam 1.10.0、jedi-masking 0.1.1)。總驗抓到三缺口(Agent 稽核 encrypted 欄沒進主系統、總覽常駐警示與稽核頁未加密標記沒排卡)開批 6 兩張補卡 CM-3280、CM-3281;GUI 開檔(Word/Acrobat/7-Zip)與 Agent 真機下載兩項手測留給決策者。
  • 2026-10-29 決策者(批 6 F4 復核時):系統沒有「稽核事件頁」可標未加密,採首腦建議拿掉這一道;D5 剩「關閉寫稽核」+「系統管理員全站常駐橫幅」兩道,橫幅文字與文件改照實寫。
  • 2026-10-29 決策者「你把它合回來呀」「好了你驗一下」:首腦合回四 repo、驗批 6、再合回;十張卡全過。
  • 2026-10-29 決策者實測「我按下載還是一樣可以直接打開」(證據附件):首腦開卡時只數了主系統匯出 route,套件自帶的上傳檔下載整條漏接。決策者「證據下載一定要加密」「你這邊直接修」:首腦直修 jedi-file-upload 1.5.0 掛點+BE 注入+FE 12 處,實打證據 docx/png 皆加密;其餘三支套件匯出端點開批 7~8 補卡。
  • 2026-10-29 決策者「不要用 7z 請用 zip,我剛剛下載不能解壓」:講明 AES zip 檔名外露且內建解壓一樣開不了、ZipCrypto 等於沒鎖後,決策者選 AES-256 zip。D3 改判,jedi-file-protect 0.2.0。
  • 2026-10-29 決策者問「檔名外露是什麼意思」:解釋後裁示「畫面上都有了,有檔名也不能幹嘛,用原檔名.zip 就好」。zip 內外都保留原檔名、只鎖內容;首腦提的中性檔名+對照表方案不做。
  • 2026-10-29 決策者「壓縮檔類不要顯示副檔名」:包 zip 的外層檔名去掉原副檔名,jedi-file-protect 0.2.1。
  • 2026-10-29 決策者「還是有問題」:問清是 docx/PDF/Excel 預覽全部哭臉,根因是 FR-166 前一晚加的 iframe sandbox 在 Chrome 變成 sandbox="undefined",不是本案;改 .attr 綁定修掉。本機 Agent 登不進去另開 session 處理,本案不碰。
  • 2026-10-29 決策者問批 7、8 要不要做:首腦判斷要(操作日誌是全站請求紀錄,比報表更敏感),決策者「你這邊直接做」「發吧,做完就發」。三支套件發版、BE 釘版;FE 三處 F2 時就接好了,只差後端收密碼。
  • 2026-10-29 決策者看到預覽框上方 Chrome 的下載/列印鈕問「真的沒辦法擋起來嗎」:三個做法(藏工具列一行/pdf.js 自繪一張卡/後端轉圖片不建議)講明各擋得住什麼後,決策者「先加那一行」;加完主站與主控台都 OK。主控台靜態包 dist-console 要重 build 才吃到。
§5

文件

以下全部由 build 掃資料夾產生,新增檔案重 build 即自動出現。標題連結指向渲染後的 HTML,md 連向源檔。

需求與討論

文件 類型 標題 最後更新
discussion / md 需求討論稿 下載檔加密 2026-10-29

設計

文件 類型 標題 最後更新
design / md 設計 下載檔加密 2026-10-29

交接與收口時間軸(handoff/,2 份)

由新到舊。每份是某一棒次交接當下的完整現況快照,看某個時間點「當時知道什麼」請從這裡進。

日期 文件 標題
2026-10-29 FR-169-STATE / md FR-169 下載檔加密 — STATE(living,只描述此刻)
2026-10-29 FR-169-LOG / md FR-169 下載檔加密 — LOG(append-only,每棒追加一 block)

資產子資料夾(無文件,不建頁):prototype/(2 個檔)

§6

Notion 卡

卡片內容(決策紀錄、驗收條件)以 Notion 為準,本頁只記座標。

關係 卡號 標題 狀態
母案 CM-3223 FR-169 下載檔加密母案 —
子卡 CM-3224 新套件 jedi-file-protect:產密碼、PDF/Office/7z 三種加密、PDF 與 Done
子卡 CM-3225 主系統:出檔前保護 helper、安全政策開關 FILE_DOWNLOAD_PROTECTION、心 Done
子卡 CM-3226 主站共用 composable useProtectedDownload +「密碼只顯示一次」對話框 Done
子卡 CM-3227 主系統其餘匯出端點全部改走 send_protected(SSP、控制項對照、RACI、風險登錄、前 Done
子卡 CM-3228 主站其餘 24 處下載全部改走 useProtectedDownload(service 層 blo Done
子卡 CM-3229 Agent 主控台:檔案與報告下載走 jedi-file-protect、心跳收 file_prot Done
子卡 CM-3230 Agent 主控台前端:檔案頁、執行紀錄、診斷包下載接 ProtectedDownloadDialo Done
子卡 CM-3231 文件:SPEC 頁(匯出類頁面各加一段「下載會加密」、安全政策頁)、使用手冊「如何開啟加密檔」、套件 Done
子卡 CM-3280 Agent 下載稽核的 encrypted 欄位進主系統+SPEC/手冊補總覽警示與未加密標記 Done
子卡 CM-3281 D5 另兩道警示:全站頂部常駐橫幅+稽核頁每筆下載標「未加密」 Done
子卡 CM-3286 三支套件的人用匯出端點加 download_responder 掛點(操作日誌、意見回饋、任務批次) Done
子卡 CM-3287 主系統注入三支套件的 download_responder+FE 三處改走 useProtectedDownload Done