線上加密安全嗎?怎麼當場核對明文沒有離開本機

頁面上寫「本機加密」「不上傳」,本身無法證明。開啟開發者工具的 Network,用一枚只有這次實驗才有的金絲雀字串去搜:請求行、請求體和分析回報裡都不該出現明文、密碼或井號後面的金鑰。AES-256-GCM 應在本機 Web Crypto 算完,才允許密文出站。

口號無法核對,流量可以

很多人判斷一個「線上加密」頁是否安全,靠的是頁面上的一句話:本機計算、零上傳、端到端。這些句子可以出現在任何網站上,包括把檔案直接 POST 到伺服器再代為加密的網站。它們不是證據。

你真正能當場看到的,是目前分頁發出了哪些請求。瀏覽器開發者工具的 Network 面板會列出方法、地址、查詢字串、請求體,以及部分造訪統計。如果你剛選中的檔名、密碼,或一段只有你知道的「金絲雀」明文出現在這些位置,所謂本機加密就不成立。

反過來,Network 裡沒有明文,只能說明這一次操作沒有把這些欄位當作業務資料發出去。它不能證明記憶體裡沒有明文、擴充功能沒有讀取剪貼簿,也不能證明下一次版本更新後行為不變。核對的價值在於:把不可檢驗的宣傳,收成一次可重複的觀察。

「本機」具體指哪一層計算

「瀏覽器本機」不是「這個域名看起來很安全」,而是「加解密發生在你正在看的這個分頁裡」。對 AES-256-GCM 來說,常見的正確路徑是呼叫 Web Crypto API:金鑰派生、加密、認證標籤都在瀏覽器提供的密碼學接口裡完成,而不是把原文交給遠端介面代算。

檔案加密的典型過程是:你透過檔案選擇器選出一個本機檔案,指令碼把它讀成記憶體中的二進位塊,按塊加密,再觸發瀏覽器下載密文。下載下來的 .lock.enc 是結果檔案,不是上傳回執。單檔案上限如果寫成 5 GB,指的是本機流式處理能力,不表示伺服器收了 5 GB 原文。

還要把「業務上傳」和「頁面自己會發出的請求」分開。開啟即用的工具站通常仍會載入樣式和指令碼,也可能傳送不含正文的造訪統計。這些請求的存在,不能用來指控「檔案被上傳了」;但統計請求的 query 或 body 裡如果出現了你剛輸入的密碼或待測密碼,那就是另一回事。

把計算邊界寫成可核對的句子,會比形容詞更有用:密碼產生、密碼檢測、隱私清洗和檔案加解密的明文與金鑰預設不離開瀏覽器;閱後即焚只允許密文出站,解密金鑰放在 URL 的 # 片段。MakePwd 按這個邊界實作工具,並且全部開啟即用、沒有帳號。承諾仍然只是承諾。下面用 Network 把它收成檢查項。

不要用真實金鑰、證件或未遮罩表格做實驗。準備一個可以丟棄的小檔案,密碼用一次性長句。核對的是流量,不是把隱私再暴露一遍。

用 Network 做一次可重複檢查

先準備一枚不會出現在真實業務裡的標記。檔名可以用 canary-local-2026.xlsx,密碼用一段隨機長句,正文裡寫一句只有這次實驗才有的話。金絲雀的作用是搜尋:在 Network 的過濾器裡貼上它,命中即失敗。

開啟開發者工具,切到 Network,勾選 Preserve log,過濾 XHR / Fetch。不要只看「成功的請求」——被取消或返回 4xx 的請求同樣可能已經帶上了明文。

然後做一次完整操作:選檔案、輸入密碼、點加密或產生。結束後先不要關面板,按下面三處看。

  1. 在過濾器裡貼上金絲雀字串,先看有沒有紅色命中。有命中就停下來讀那條請求,不必再往下做「感覺上像本機」的判斷。
  2. 沒有命中時,再逐條開啟 XHR / Fetch,對照請求行、查詢字串和請求體。靜態資源、字型和指令碼可以忽略。
  3. 單獨過濾造訪統計路徑,開啟 query 與 body。頁面標題和路徑可以出現;剛輸入的密碼、待測密碼、清洗前原文和檔案內容不應出現。

看請求行

完整 URL 裡的 path 和 ? 後面的查詢值得逐字看。id 這類定位欄位可以出現;檔名、密碼、待測密碼、# 後面的金鑰不應該出現。把網址列整串和請求行對比:井號之後的部分如果進了請求行,說明實作把 fragment 錯用成了 query,或指令碼主動讀取後寫進了請求。

看請求體

POST / PUT 的 payload 是第二處。檔案加密如果聲稱本機完成,請求體裡不該有原檔案二進位,也不該有密碼。閱後即焚可以有密文欄位,那是預期出站的資料;你要確認它看起來不像你剛輸入的原文。密碼檢測頁如果把待測密碼 POST 出去,無論目的寫成「查外洩」還是「算強度」,都已經離開了本機。

單獨看分析回報

造訪統計經常被忽略。主接口乾淨、回報卻帶著輸入框全文,這次操作仍不能算「明文留在瀏覽器」。過濾統計路徑時,不要假設「分析指令碼一定無害」——它只是另一類出站請求,檢查方式與業務介面相同。

勾選 Preserve log。加密完成後如果頁面跳轉或重新整理,未勾選時第一條帶明文的請求可能已經被清掉,你會得到虛假的「面板是空的」。

問號會進 HTTP,井號預設不會

URL 有兩段常被混在一起。問號後面的查詢會進入 HTTP 請求行,伺服器、反向代理和造訪紀錄都能看見。井號後面的片段預設由瀏覽器留在本機,用來給目前頁的指令碼讀,不隨這次文件請求發給伺服器。

因此,一次性密文連結如果把金鑰放進 #,接收方開啟 s.html?id=...#金鑰 時,伺服器按設計只能看到 id,看不到金鑰。這不是額外的加密協議,而是瀏覽器對 fragment 的預設行為。它有邊界:你把完整地址貼進工單、群聊或某些會丟掉 hash 的跳轉頁,金鑰就從「不進 HTTP」變成「出現在別人的螢幕和日誌裡」。

核對方法同樣具體:建立一條測試焚鏈,看建立請求的 body 是否只有密文;開啟閱讀頁時,看文件請求和後續介面的 URL 是否只含 id。網址列裡 # 後面的內容不應出現在這些請求裡。閱讀頁對接收方公開,不需要登入。

看哪裡 會不會進 HTTP 怎樣算透過
頁面口號 不涉及 不能當證據,只作對照
請求行 / query 無金絲雀、無密碼、無 fragment 金鑰
POST body 無原文;焚鏈只允許密文
URL # 片段 預設不會 網址列有、請求行沒有
造訪統計 看實作 無輸入框原文

你能證明什麼,不能證明什麼

這次檢查能支援的結論很窄,寫清楚反而更有用。

能支援:在你使用的這個瀏覽器、這個版本、這一次操作裡,明文、密碼和 fragment 金鑰沒有作為已觀察到的 HTTP 業務資料或分析原文離開分頁。

不能支援:沒有別的分頁或擴充功能在讀剪貼簿;硬碟上的下載目錄是安全的;對方收到密文後不會截圖;密碼檢測覆蓋了全網外洩資料庫。如果檢測只做本機熵和一份公開弱密碼 Top 列表,它只能回答「像不像常見弱密碼」,不能回答「從未出現在某次外洩中」。那不是全網 HIBP 撞庫。

也不要把它理解成滲透測試。你沒有檢查 WebSocket、Service Worker 快取,也沒有逆向混淆指令碼。目標是讓自己能向同事解釋:我打開了 Network,用金絲雀搜過,請求行和 body 是乾淨的。這比轉發一句「官網說不上傳」更接近工程討論。

把同一套步驟用在開啟即用的工具上

若你希望用一個把計算邊界寫清楚的頁面來練習,可以從 MakePwd 的檔案加密盒開始。開啟即可使用,無需註冊。選一個不含真實隱私的小檔案,密碼用金絲雀,加密後下載 .lock。同時盯著 Network:你應看到靜態資源和可能的造訪統計,不應看到原檔案或密碼作為業務欄位。演算法按網站說明是 AES-256-GCM,在 Web Crypto 裡算,單檔案不超過 5 GB。

閱後即焚適合練第二項:建立一條無害測試文本,確認出站的是密文;閱讀頁對接收方公開,連結形態是 s.html?id={id}#{key}。密碼檢測適合練「輸入框內容會不會進統計」——待測密碼按產品說明不上傳,比對發生在本機名單。

這些練習的目的不是證明某一個網站「絕對安全」,而是讓你把同一套核對步驟用熟。換任何聲稱本機加密的頁面,步驟不變:金絲雀、Preserve log、請求行、請求體、統計回報。

下次核對時記住的三件事

第一,看流量,不看口號。第二,密文出站可以接受,金鑰和原文不行。第三,換瀏覽器、換版本、換功能後重新做一遍金絲雀搜尋。能重複的觀察,才值得寫進你們自己的安全說明。

如果你還要繼續追問「為什麼金鑰可以放在井號後面」,請讀URL 的井號後面為什麼適合放金鑰,以及什麼時候會失效。本文只把「明文有沒有離開這個分頁」收成可以當場做完的檢查。