公開文件
AegisMeetings 零知識加密架構白皮書
本文件向任何讀者公開說明架構、威脅模型與保證邊界;設計以開放密碼學標準為基礎,歡迎獨立檢視。完整技術敘述見下方正文。
版本 2.3 · 發布日期 2026-07 · 公開版,不含實作細節
版本 2.3 · 發布日期 2026-07-09 · 公開版(不含實作密鑰、內網位址、程式碼名稱、自訂資源名稱)
🌐 閱讀說明
- 本文件分兩部分:概覽以白話說明核心設計理念與安全保護;技術規格深入密碼學架構與金鑰層級,供獨立驗證。
- 密碼學術語(AES、RSA、XChaCha20 等)保留英文原名。
- 「誠實窗口期」(Honest Processing Window):音檔(與為提升 ASR 準確度而需解密的自訂詞庫)送進轉錄主機後、暫存資料被安全抹除前,唯一短暫接觸明文的時段;資料只存在處理記憶體與極短暫的暫存區,不作持久保存。
目錄
概覽
技術規格
概覽
一句話保證
你的會議音檔、逐字稿、AI 摘要與自訂詞庫,連 AegisMeetings 自己都讀不到。
這不是一句承諾,而是一個由密碼學「鎖死」的設計:資料在你的裝置上就先上鎖,鑰匙從不離開你。即使我們的工程師、系統管理員,甚至入侵伺服器的駭客,拿到的也只是一堆無法解開的密文。
唯一的例外,是 AI 轉錄當下需要短暫「聽」一次你的音檔——這一點我們誠實揭露,並用嚴格的隔離把它的暴露面壓到最低(見誠實窗口期(Honest Processing Window))。
誰能看到你的資料?
| 角色 | 看得到 | 看不到 |
|---|---|---|
| 你的瀏覽器(你自己的裝置) | 全部明文(這是你的東西) | — |
| 我們的伺服器 | 一堆上了鎖的密文、基本帳號資訊、詞庫 Blob 路徑與筆數 | 你的音檔、逐字稿、摘要、詞庫內容的任何明文 |
| 雲端儲存空間 | 加密檔案(對它而言是亂碼) | 任何可讀內容 |
| 轉錄主機(AI 處理) | 處理當下那一筆音檔與相關詞庫(用完即清除) | 你過去所有會議、其他人的資料 |
重點:就算有人同時偷走我們的伺服器、資料庫、雲端儲存,他拿到的也只是解不開的密文。
為什麼連我們也解不開?
三句話講完:
- 鑰匙在你手上,不在我們這。 你第一次建立金庫時,加密金鑰是在你的瀏覽器、你的裝置裡產生的,從來沒有傳到我們的伺服器。
- 我們只保管「上了鎖的保險箱」。 你的資料在離開裝置前就已經加密;我們存的是密文,沒有你的金庫私鑰(你逐字稿、摘要等密封產出的唯一解鎖鑰匙)。
- 只有你的裝置能開鎖。 解密的運算全部發生在你的瀏覽器內,靠你的生物辨識(Face ID/指紋/Windows Hello)或你的金庫密碼來解鎖。
簡單比喻:你把貴重物品鎖進保險箱才寄放給我們,鑰匙你自己留著。我們能幫你保管箱子、搬運箱子,但永遠打不開它。
唯一的例外:誠實窗口期(Honest Processing Window)
要把語音變成文字、做出摘要,AI 必須真的「聽」一次音檔——這是任何 AI 轉錄服務都繞不過的物理現實。我們選擇誠實面對,並用以下方式把風險壓到最低:
- 處理 AI 的「轉錄主機」與對外網站是兩套完全分離的系統,職責與權限互不相通。
- 解密後的音訊只存在於記憶體,處理完畢立刻刪除,不會在硬碟留下可播放的明文檔。
- 為提升語音辨識準確度,自訂詞庫(通用/專屬/會議)亦在同一窗口期於記憶體中短暫解密為 ASR 熱詞,不寫入磁碟、不持久保存。
- 轉錄主機關閉了記憶體置換(swap),降低明文被寫到磁碟的機會。
- 除了這個短暫窗口期,你所有「靜態儲存」的資料,連我們自己都讀不到。
我們合作的雲端 AI 服務(Microsoft Azure OpenAI)依其官方資料隱私政策不會用你的資料訓練它的模型。
換裝置/遺失裝置怎麼辦?
因為鑰匙只在你手上,我們無法「幫你重設密碼」。但我們準備了兩條安全的後路:
- 換新手機/新瀏覽器:在你已經登入、已授權的舊裝置上,於「安全設定 → 授權新裝置」產生限時配對資訊——12 碼配對碼 + 6 位 PIN 碼,以及可掃描的 QR Code(手機/平板掃描可開啟授權頁並自動填入)。在新裝置的「安全設定 → 從其他裝置授權此裝置」輸入配對碼與 PIN,或掃 QR 完成綁定。整個過程伺服器只是「加密包裹的中繼站」,看不到你的鑰匙。
- 所有裝置都遺失了:你第一次建立金庫時,系統會自動下載一份 Aegis Recovery PDF(內含 24 字助記詞與加密私鑰)。把它存好(雲端硬碟或 USB,建議兩份異地備份),日後上傳到復原頁面就能在你的瀏覽器本地還原——PDF 內容同樣不會傳到我們伺服器。
⚠️ 這份 PDF 等同你金庫的最高鑰匙,請妥善保管、切勿外流。
技術規格
本部分提供演算法選型、金鑰階層、信任邊界與雲端網路控制,供獨立驗證。所有圖表均去識別化:不揭露內網位址、訂用識別、自訂資源名稱或程式碼路徑;網路元件以通用 Microsoft Azure 服務名稱與邏輯角色描述。
1. 密碼學架構(演算法與金鑰階層)
1-1. 金鑰不離開你的裝置
主私鑰(RSA-4096)由瀏覽器在使用者裝置記憶體內生成,從不傳送至伺服器。保護該私鑰的對稱金鑰有兩條衍生路線:
- WebAuthn PRF(硬體路線,優先):金鑰衍生材料綁定於裝置安全晶片(Secure Element/TPM)。攻擊者即使取得實體裝置,也須通過生物辨識或 PIN;純軟體攻擊無法繞過硬體屏障。
- Argon2id(密碼路線,降級方案):用於不支援 WebAuthn PRF 的環境。保護私鑰的對稱金鑰由**金庫密碼 + 伺服器下發 Salt + 僅存於該瀏覽器 IndexedDB 的「裝置秘密(device secret)」**經 Argon2id(128 MB 記憶體成本)衍生。僅有密碼、缺少該瀏覽器的裝置秘密,無法還原私鑰——避免「同時竊得伺服器密文與使用者密碼即可在任意電腦解密」的風險。
音訊金鑰的誠實窗口期傳遞路徑(為避免語病,需明確說明):音檔以各會議專屬的音訊金鑰(以 HKDF 自每筆會議的隨機主秘密衍生,詳見 §1-3)在瀏覽器端加密後,以 SAS Token 直接上傳至 Blob——音檔位元組從不流經網站 VM。與此同時,音訊金鑰以轉錄主機公鑰再度封裝,連同 Blob 音檔位址一起置入 Service Bus 任務訊息 payload,由任務佇列傳遞至轉錄叢集——此金鑰材料不寫入資料庫。轉錄主機收到任務後,於記憶體以自身私鑰解封取得音訊金鑰,從 Blob 下載密文並解密,於記憶體執行語音辨識;任務結束後音訊金鑰連同音訊明文一起清除,轉錄叢集不再保有任何音檔解密能力。
此設計的必然意涵:資料庫中不存在以轉錄主機為對象的音檔解密金鑰,任務訊息消費後即消失。若使用者遺失裝置私鑰,AegisMeetings 從系統設計上即無法為其解密已儲存的音檔——這是零知識架構的代價,也是保護所有使用者不受服務提供者濫用的根本機制。
1-2. 演算法選型
| 用途 | 演算法 | 選用理由 |
|---|---|---|
| 主金鑰對 | RSA-4096 OAEP | 業界標準,主流瀏覽器原生支援 |
| 私鑰靜態保護 | AES-256-GCM | 硬體加速、NIST 標準 |
| 音檔上傳密文(瀏覽器) | libsodium secretstream(XChaCha20-Poly1305) | 串流式 AEAD、大 nonce 空間,適合大型音檔分塊 |
| 轉錄產出密文 | XChaCha20-Poly1305 家族 | 與上傳鏈路一致之 libsodium 管線 |
| 金鑰衍生(密碼路線) | Argon2id | 2015 Password Hashing Competition 冠軍,抗 GPU/ASIC 暴破 |
| 裝置綁定(硬體路線) | WebAuthn PRF | W3C 標準,衍生材料由裝置安全晶片產生 |
| 訊息完整性 | HMAC-SHA256 | 確保系統內部任務訊息未遭竄改 |
| 會議子金鑰分離 | HKDF-SHA256 | 自每筆會議的隨機主秘密以固定 info 分流出音訊金鑰與 HLS 串流金鑰 |
1-3. 金鑰階層
使用者主金鑰對(RSA-4096)
│ ← 裝置生成,私鑰從不上傳
│
└── 每筆會議的加密金鑰材料(以你的 RSA 公鑰封裝,存於資料庫)
│
├── 上傳路徑:32 位元組每筆會議隨機主秘密(高熵)
│ → HKDF-SHA256(RFC 5869;固定 info 區隔用途)
│ ├── 音訊金鑰(32B)… 音檔 secretstream 加密
│ │ ↑ 同時以「轉錄主機公鑰」再度封裝,隨 Service Bus 任務 payload 傳遞(不寫入 DB);
│ │ 轉錄主機於記憶體解封 → 解密音訊 → 任務完成即清除;
│ │ 網站 VM 無轉錄主機私鑰,從設計上無法代為解密
│ └── HLS 串流金鑰(16B)… HLS 串流 AES-128 切片(與音訊金鑰分離,避免跨協定重用)
│
└── 逐字稿金鑰 ← 轉錄主機產出後,以你的 RSA 公鑰包入每筆會議的加密金鑰材料
每筆會議使用獨立對稱材料:即使單一會議洩漏也不波及其他會議。逐字稿等密封產出的金鑰(存於每筆會議的加密金鑰材料中)受你的 RSA 主公鑰保護,只有你的私鑰能解開;音訊金鑰另行以轉錄主機公鑰封裝,透過 Service Bus 任務訊息傳遞(不持久化至 DB),供轉錄主機於誠實窗口期記憶體使用,任務完成後隨即清除——兩組封裝路徑互相獨立,各自以不同金鑰持有方為對象;任務結束後轉錄主機不再保有任何音檔解密能力。
1-4. 靜態儲存的型態
| 資料 | 存放位置 | 內容 | 誰能解讀 |
|---|---|---|---|
| 音檔(整檔或即時分片) | 雲端 Blob 儲存 | 加密密文物件 | 持有你私鑰的裝置;或轉錄主機於誠實窗口期內(以自身私鑰解封音訊金鑰,記憶體解密) |
| 逐字稿/摘要/重點/待辦(密封 bundle) | Blob(主存)+資料庫(指標) | 密文存於 Blob;資料庫僅存路徑、長度、完整性雜湊 | 只有持有你私鑰的裝置 |
| 詞庫(通用/專屬/會議,各獨立 Blob) | Blob(主存)+資料庫(指標) | 以音訊金鑰 XChaCha20-Poly1305 密封;資料庫僅存 Blob 路徑與詞彙筆數,不存任何詞彙明文、密文或逐詞雜湊 | 持有你私鑰的裝置;或轉錄主機於誠實窗口期(在記憶體中解密為 ASR 熱詞,任務結束即清除) |
| 每筆會議的加密金鑰材料 | 資料庫 | 以你的 RSA 公鑰鎖住 | 只有持有你私鑰的裝置 |
伺服器(含資料庫、Blob)所見的靜態內容皆為「無對應私鑰即無法解讀之密文」,或僅為路徑/雜湊/筆數等不可還原之指標。
1-5. 自訂詞庫(三型 Blob)
為提升 ASR 準確度,使用者可維護三種詞庫,皆以音訊金鑰(與逐字稿金鑰相互獨立)XChaCha20-Poly1305 密封存放;靜態儲存時一般伺服器無法讀取詞彙內容,但轉錄主機於誠實窗口期會將指定詞庫在記憶體中解密為 ASR 熱詞(見下方操作說明):
| 類型 | 用途 | 靜態存放 |
|---|---|---|
| 通用詞庫 | 跨會議共用的專有名詞 | 獨立密封 Blob |
| 專屬詞庫 | 綁定特定分類的術語 | 各分類一個獨立密封 Blob |
| 會議詞庫 | 單場會議專用詞彙 | 各會議一個獨立密封 Blob |
- 瀏覽器端:編輯詞彙 → 以音訊金鑰密封 → 經 SAS 直傳 Blob;Web API 僅寫入路徑與筆數。
- 轉錄主機:任務派發時攜帶 Blob 指標;於誠實窗口期(Honest Processing Window)在記憶體中解密合併為 ASR 熱詞(上限截斷),任務結束即清除。
- 已廢止:資料庫逐詞 RSA 加密列或逐詞雜湊——現行架構不在 DB 保存任何詞彙形式。
2. 信任邊界
| 區域 | 可見資料 | 不可見資料 |
|---|---|---|
| 瀏覽器(你控制) | 金鑰、解密後明文 | —(這是你的裝置) |
| 網站伺服器(我們營運) | 密文、元資料(會議時間、參與者帳號) | 音檔/逐字稿/摘要的任何明文 |
| 雲端儲存 | 加密檔案(對它是亂碼) | 任何可讀內容 |
| 轉錄主機(我們營運,半信任) | 誠實窗口期內的明文音訊與相關詞庫(處理即清除) | 歷史會議、網站伺服器的任何憑證 |
即便有人同時取得網站伺服器、資料庫與雲端儲存的完整存取權,得到的也只是無法解密的密文。
3. 多裝置授權與降級路線
3-1. 跨裝置授權(帶外傳輸/配對碼)
要在新瀏覽器或新裝置使用既有金庫時:
- 在已解鎖且已授權的裝置 A,於「安全設定 → 授權新裝置」產生限時 15 分鐘的配對資訊:12 碼配對碼 + 6 位 PIN 碼,以及 QR Code(供新裝置掃描自動填入)。
- 在新環境 B 的「安全設定 → 從其他裝置授權此裝置」,輸入配對碼與 PIN(或掃描 QR),向伺服器領取經 PIN 加密的私鑰包裹(包裹對伺服器不可讀)。
- 包裹被領取後即自伺服器刪除(防重放)。
- B 於本地以 PIN 解開包裹後,依環境支援之方式重新綁定(WebAuthn PRF 或 Argon2 + 該瀏覽器新生之裝置秘密)。
全程伺服器僅為「加密包裹中繼站」,無法讀取傳輸中的私鑰;金庫密碼從不傳送至伺服器。
配對強度(與金庫主密碼區分):配對碼(12 碼十六進位)與 PIN(6 位數)各司其職——前者用於向伺服器領取包裹,後者在本機解密包裹內的私鑰;二者均需正確才能完成授權。此設計不具金庫密碼等級的離線暴破抵抗力。實作上以極短時效(15 分鐘)、成功綁定後刪除、伺服器端 API 限速與濫用偵測約束線上枚舉。需長期離線抵抗請以 Recovery PDF 或 WebAuthn PRF/金庫密碼路線為準。
3-2. 各路線的綁定範圍
- WebAuthn PRF 使用者:能否跨裝置取決於驗證器類型。雲端同步 Passkey 可於已同步環境使用;Windows Hello、Touch ID 等強綁定驗證器在新裝置須先完成配對(3-1)或以 Recovery PDF 復原後重新綁定。
- Argon2 密碼路線使用者:同一瀏覽器設定檔內需「金庫密碼 + 該瀏覽器裝置秘密」;換瀏覽器/設定檔/裝置時,單靠帳密與金庫密碼無法綁定,須以配對碼或 Recovery PDF 完成。
- 清除瀏覽器網站資料(連帶清除 IndexedDB):等同失去該瀏覽器的綁定,須以 Recovery PDF 或配對碼重新綁定。
4. 災難復原(Recovery PDF)
- 首次建立金庫時自動下載 Aegis Recovery PDF,建議妥善保存並異地備份。
- PDF 內含:① 24 字助記詞(BIP-39 相容,頁面同時印出供人工核對)② QR Code ③ 完整加密私鑰(以助記詞 + Argon2id 加密,嵌於 PDF 元資料)④ 金庫密碼(密碼路線備用)。
- 復原時將 PDF 上傳至復原頁面,瀏覽器本地解析還原私鑰,內容不傳送至伺服器。
⚠️ 復原依賴 PDF 的完整電子檔;僅列印紙本會遺失元資料中的加密私鑰 payload,紙本無法數位復原。 ⚠️ 此 PDF 等同金庫最高存取憑證,請勿分享。
5. 安全保證與已知限制
我們保證
- ✅ 服務端無法解密:全部伺服器遭入侵,攻擊者也只拿到密文。
- ✅ 儲存洩漏安全:雲端儲存外洩時所有檔案均為加密狀態。
- ✅ 最小歷史暴露:轉錄主機遭入侵,至多看到當下處理中的單筆會議,無法存取歷史。
- ✅ 部署時機密注入:執行期機密僅於部署時經 Managed Identity 自 Key Vault 拉取一次,注入受權限保護之本地快取,運行時零外部機密查詢。
- ✅ PHP 執行環境沙箱化:危險系統函數停用、檔案系統存取受限,即便 RCE 也難執行系統指令。
- ✅ 唯讀應用程式層:部署後程式碼目錄 root 擁有、PHP 僅讀取,無法植入 Web Shell。
- ✅ 核心前端資源自託管:字型、樣式與應用程式 JS/CSS 由本站自建置產物託管;少數執行所需第三方(如 libsodium WASM、邊緣分析)以 CSP 明確允許清單納入(見 §7)。
- ✅ API 全域限速:所有端點限速,敏感端點更嚴格。
- ✅ VM 磁碟全程加密(Encryption at Host)。
- ✅ 網路最小暴露面:應用 VM 不綁定可直接從網際網路撥入的公網介面;管理通道不倚賴對外開放之 SSH 埠。
- ✅ 資料庫自動備份;程式碼以 Git + CI/CD 為還原真相來源。
- ✅ 供應鏈安全掃描:每次部署前
composer audit+npm audit,高風險即中止;並啟用 Dependabot 持續監控。 - ✅ 依賴版本鎖定:正式環境僅用 lock 檔精確版本。
已知限制(誠實告知)
- ⚠️ 使用者裝置遭入侵:攻擊者控制你的瀏覽器後可讀取記憶體中的私鑰;任何客戶端加密系統在此情境皆無法保護。
- ⚠️ AI 處理窗口期:轉錄期間明文短暫存在於轉錄主機記憶體中(見誠實窗口期(Honest Processing Window))。
- ⚠️ 無靜態主金鑰的前向保密性:主私鑰若洩漏,歷史會議理論上可被解密。此為靜態主金鑰架構的本質取捨;未來版本規劃引入每次會議的臨時金鑰。
- ⚠️ 營運元資料為明文:會議時間、時長、參與者帳號、處理狀態等為明文,用於系統運作;使用者可選將會議顯示標題以客戶端加密形式儲存(伺服器仍無法解讀)。
- ⚠️ 配對碼與 PIN 熵有限:見 §3-1,設計為短時帶外授權,不等同金庫主密碼的離線暴破抵抗力。
6. 雲端與網路縱深防禦
本章說明營運面如何與密碼學零知識互補;以「誰有公網、誰沒有、誰能連誰」描述,不揭露內網位址、訂用識別或自訂資源名稱。下圖為同一章節的總覽架構圖(細節見各小節表格)。
6-1. 入口三層
攻擊者無法略過 Cloudflare 直打網站 VM——因為網站 VM 沒有對外公網介面;若改打負載平衡器入口且來源不在 Cloudflare 白名單,則在網站子網 NSG 被明確拒絕。
6-2. 網站子網 NSG 入站(邏輯順序)
| 優先序 | 規則(邏輯) | 來源 | 目的埠 | 動作 |
|---|---|---|---|---|
| 高 | LB 健康探針 | Azure 負載平衡器 | 80 | Allow |
| 中 | Cloudflare 回源白名單 | Cloudflare 公布之公網段 | 80, 443 | Allow |
| 低 | 拒絕其他外網 | 外網際網路 | 80, 443 | Deny |
| 預設 | 虛擬網路內 | 同虛擬網路 | * | Allow |
網域須維持 Cloudflare Proxy(橘雲);改 DNS only(灰雲)將因回源不帶 Cloudflare 特徵而被拒絕——此為刻意設計。
6-3. 資料平面、身分與內網路徑
- Key Vault/Blob/資料庫/Azure OpenAI:公網端點關閉或對 Worker 不可達;網站 VM 與轉錄主機以 Private Link + Managed Identity 存取資料平面;連線字串外洩仍無法從一般外網直連。
- 身分分離:網站受管身分與轉錄主機受管身分不同;轉錄專用私鑰、佇列完整性金鑰僅轉錄身分可讀,網站應用無法代為解密。
- 內部 Webhook:走虛擬網路內 HTTPS,不依賴使用者可見的公網網域。
- Service Bus:發佈任務時附 HMAC-SHA256;轉錄主機消費前驗證,不符則拒收並進入死信佇列。佇列依方案分流(VIP/優先/一般)。
6-4. 轉錄主機 VMSS 雙向隔離
轉錄叢集與網站 VM 使用不同 NSG,不配置公網 IP(NSG 掛於 VMSS 網路介面),設計為「Internet 無法直接入站、白名單外出站一律拒絕」:
| 方向 | 類別 | 目的地(邏輯) | 用途 |
|---|---|---|---|
| 入站 | 維運(可選) | 同虛擬網路 | 僅 VNet 內有限通道(如 SSH);無 Internet 來源允許 |
| 出站 | 平台 | Azure 中繼資料與 DNS | 受管身分、名稱解析(含 Private Link 的 privatelink 解析) |
| 出站 | 資料平面 | Private Endpoint 子網 | Blob、Key Vault、Redis、Azure OpenAI(443) |
| 出站 | 任務佇列 | Service Bus 服務標籤 | 拉取/完成任務(Standard 佇列,尚無 Private Link) |
| 出站 | 可觀測性 | Azure Monitor 服務標籤 | Application Insights 等遙測 |
| 出站 | 容量 | Azure Resource Manager | VMSS 擴縮 |
| 出站 | 回報 | 網站 VM 子網(VNet 內) | 僅內部 HTTPS Webhook |
| 出站 | 預設 | 其餘全部 | DenyAllOutbound 一律拒絕 |
即使轉錄主機遭 RCE,也難以向任意公網 C2 外傳資料(僅能走上述白名單 Azure 目的地與網站內網 webhook)。開機時關閉 swap、機密自 Key Vault 注入、語音模型於映像階段預裝並載入記憶體。
6-5. 與密碼學章節的關係(務必區分)
| 若發生… | 網路層(本章) | 密碼學層(§1–§4) |
|---|---|---|
| 入侵者取得 DB + Blob 快照 | 仍可能拿到密文與元資料 | 無私鑰則無法解讀內容 |
| 繞過 Cloudflare 直打 LB | NSG 拒絕非 CF 來源 | — |
| 轉錄主機被入侵 | 僅影響當下單筆任務 | 歷史密文仍受 RSA 保護 |
| XSS 於瀏覽器執行 | — | 可能讀取已解鎖裝置記憶體內金鑰(見 §5 限制) |
網路層提供縱深防禦與攻擊面最小化;使用者內容機密性仍主要由客戶端金鑰與零知識管線承擔,兩者不可互相替代。
7. 傳輸層、CSP 與執行環境
7-1. Content Security Policy(重點)
| 指令 | 設定(摘要) | 說明 |
|---|---|---|
script-src |
'self' + 少數明示來源 |
支援 libsodium WASM(音檔加密於瀏覽器記憶體);wasm-unsafe-eval 為已知取捨 |
connect-src |
'self' + Blob 儲存原點 |
瀏覽器不直連 Azure OpenAI;LLM 呼叫發生於轉錄主機出站 |
form-action |
'self' + Paddle Checkout 網域 |
付款表單僅能提交至 Paddle(Merchant of Record) |
frame-ancestors |
none |
防 Clickjacking |
object-src / base-uri |
none / 'self' |
禁老舊外掛、阻 base 注入 |
搭配 X-Content-Type-Options: nosniff、Referrer-Policy、Permissions-Policy、Strict-Transport-Security(HSTS 1 年)、upgrade-insecure-requests。
即便 XSS 發生,攻擊者仍無法自伺服器讀取你的金庫私鑰或會議明文(該等資料不在伺服器端以明文存在)。
7-2. 機密管理(部署時注入)
執行期機密僅於部署時經 Managed Identity 自 Key Vault 拉取一次,寫入受權限保護之本地快取(PHP-FPM 唯讀);運行時零 Key Vault 網路呼叫。正式環境不依賴明文 .env。
7-3. 拿到 Session 也沒有金鑰
| 攻擊者取得 | 能做 | 不能做 |
|---|---|---|
| Session Token | 模擬登入發 API | 無法取得私鑰(只在瀏覽器記憶體) |
| 資料庫密文 / 包裹金鑰 | — | 無法解密/解包,需使用者私鑰 |
Session + 資料庫 + 雲端儲存全拿 = 仍拿不到明文。
7-4. 濫用防護與金流
- 限速:全域 API 限速;金庫建立、SAS 授權、配對等敏感端點更嚴格。
- 上傳/轉錄濫用閘:建立會議頻率與並行未完成轉錄上限;失敗累計達閾值暫停上傳(紀錄僅含風控指標,不含會議內容)。
- 會議處理鎖:以 Redis 協調,避免重複派工或 webhook 競態。
- 金流(Paddle):訂閱、續期、退款由 Paddle(Merchant of Record)處理;金流整合上線前相關頁面可能尚未開放,目標架構不變。
7-5. Session 生命週期
可設定閒置登出(1 小時/8 小時/1 天/7 天,預設 7 天);過期時瀏覽器自動清除本地金鑰快取。Session 內容寫入 Redis 前經伺服器端加密;Cookie 強制 secure、httponly、samesite=Lax。
8. 資料流與處理環境(記憶體/密文邊界)
| 階段 | 執行環境 | 資料型態與留存 |
|---|---|---|
| 金鑰生成與解鎖 | 使用者瀏覽器(裝置記憶體) | 私鑰與明文僅在裝置;不上傳 |
| 音檔上傳 | 瀏覽器 → Blob(SAS 直傳) | 全程密文;網站 VM 不接觸明文 |
| 即時錄音 | 瀏覽器 → Web PubSub → Blob | 分片加密直傳;停錄後 使用者裝置 以金鑰呼叫 live-dispatch-asr/ensure-play-assets;伺服器不代為補金鑰 |
| 詞庫編輯 | 瀏覽器 → Blob(SAS 直傳) | 音訊金鑰密封;DB 僅路徑與筆數 |
| 任務派發 | Service Bus | 任務描述 + Blob 音檔位址 + 以轉錄主機公鑰封裝的音訊金鑰(不存 DB)+ 完整性標記;不含任何明文 |
| 轉錄與 AI | 轉錄主機 VMSS(RAM 工作區) | 誠實窗口期:音訊與詞庫明文僅於記憶體與極短暫存;結束即刪除 |
| 產出入庫 | Blob(主存)+資料庫(指標) | 逐字稿等為密文 bundle;DB 僅路徑/雜湊 |
| 逐字稿閱讀/編輯 | 使用者瀏覽器 | 自 Blob 下載密封 bundle → 本地解密/編輯/回寫;伺服器不解密封包內文 |
| 進度回報 | 內網 Webhook → 網站 VM | 僅 Blob 指標與完整性欄位 |
| 訂閱付款 | Paddle(外部 MoR) | 帳務資料與會議密文分離 |
| 網站 API | 網站 VM | 密文、元資料、鎖與計數;無使用者私鑰與明文 |
原則:靜態儲存一律視為密文;唯一允許短暫明文的區段為轉錄主機 VMSS 的誠實窗口期,記憶體為主、關閉 swap、任務結束即清除。
9. 名詞解釋
| 術語 | 說明 |
|---|---|
| 零知識加密 | 服務提供者在設計上無法讀取使用者儲存資料的架構 |
| 端對端加密(E2EE) | 全程僅收發雙方可解讀。AegisMeetings 不屬於 E2EE:AI 轉錄需在轉錄主機短暫處理明文(誠實窗口期) |
| 誠實窗口期 | 音檔進入轉錄環境後至抹除前、資料僅於記憶體流動之唯一明碼時段 |
| RSA-4096 / AES-256-GCM | 業界標準非對稱/對稱加密演算法 |
| XChaCha20-Poly1305 | 現代 AEAD;音檔上傳經 libsodium secretstream 串流封裝 |
| Argon2id | 2015 密碼雜湊競賽冠軍,用於由密碼安全衍生金鑰 |
| WebAuthn PRF | W3C 標準,由裝置安全晶片產生金鑰衍生材料,無物理驗證則無法衍生 |
| 裝置秘密(device secret) | 僅存於瀏覽器 IndexedDB 的隨機秘密,參與密碼路線金鑰衍生;伺服器不持有 |
| HMAC-SHA256 / HKDF-SHA256 | 訊息完整性驗證/金鑰衍生函數 |
| SAS Token | 限時限權的雲端儲存存取憑證,供瀏覽器直傳音檔與詞庫 Blob,過期失效 |
| 詞庫 Blob(通用/專屬/會議) | 以音訊金鑰密封的自訂詞彙桶;DB 不存詞彙內容,僅存路徑與筆數 |
| 密封 bundle(sealed bundle) | 逐字稿/摘要等產物以 XChaCha20-Poly1305 密封後存 Blob;閱讀與編輯在瀏覽器本地完成 |
| Managed Identity | Azure 無密碼機器身分,供服務間安全存取 |
| Private Endpoint / Private Link | 將雲端資源以私有網路連線接入內網,關閉公網端點 |
| NSG(網路安全群組) | 子網或 VM/VMSS 網路介面上的入出站防火牆規則 |
| Egress Filtering(出站過濾) | 限制伺服器對外連線目的地,阻斷資料外洩途徑 |
| 前向保密性 | 即便長期金鑰洩漏,過去通訊仍受保護的特性 |
10. 聯絡資安團隊
若你發現潛在安全性問題,請先私下聯繫,給我們在公開揭露前完成修復的機會:
我們承諾第一時間回覆、驗證並修復。在修復完成前,懇請對漏洞細節保密,共同保護所有使用者的資料安全。