安全性說明
窯烤便當的設計目標是:就算伺服器被看光,你的檔案也只是一堆打不開的亂碼。以下說明我們怎麼做到,以及做不到的地方。
配對碼拆成兩半
10 碼配對碼的前 4 碼是房間號碼,會送到伺服器用來找房間;後 6 碼是密語,永遠不會離開你的瀏覽器。分享連結把配對碼放在網址 # 後面,瀏覽器不會把這段送給伺服器。
CPace 金鑰交換
新成員用後 6 碼和在線成員進行 CPace(一種 PAKE 演算法,以 ristretto255 實作)交握,並以 HMAC 互相確認。伺服器只負責轉送,無法冒充任何一方,也無法拿轉送的內容離線暴力破解配對碼。交握成功後,房間主金鑰才會被加密傳給新成員。
所有內容都在瀏覽器加密
聊天訊息、檔名、檔案類型與檔案內容一律使用 AES-256-GCM 加密。檔案切成 8 MiB 的區塊逐塊加密,區塊序號與是否為最後一塊都綁進驗證資料,無法被重排或截斷。伺服器透過金鑰衍生的雜湊值驗證成員身分,但拿不到房間金鑰本身。
長度偽裝
短訊息與檔名會以 ISO/IEC 7816-4 方式補齊到 256 bytes 的倍數再加密;檔案大小以 Padmé 分級填充,最多多出約 12%。
加密抹除
房間到期時,伺服器會刪除所有物件與記憶體資料,另有每 10 分鐘的清理排程與 R2 的 1 天保存上限作為保底。雲端儲存的刪除無法保證硬碟被物理抹除,但真正的保證來自加密抹除:伺服器從頭到尾只有密文,金鑰從未離開瀏覽器,房間結束後殘留的密文永遠無法解開。
猜碼與濫用防護
配對時使用 Cloudflare Turnstile 檢查是否為真人,並依 IP 與房間限制嘗試頻率。一組等待中的配對碼被猜錯 5 次就作廢;房間累計被猜錯 10 次就停止接受新成員。
仍然會外洩的資訊
誠實說明:伺服器看得到你何時傳送訊息、傳了幾個檔案、檔案大約的大小級距,以及有多少人在房間裡。全員離線時新成員無法加入。另外,伺服器重新部署時,所有進行中的房間都會中斷。
瀏覽器端保存
為了讓手機休眠後能無感重連,房間金鑰會以一把不可匯出的裝置金鑰加密後存在 IndexedDB,房間結束或到期時立即刪除。網頁使用嚴格的內容安全政策(CSP)限制能載入的程式與連線對象。