先記結論:本地加密能當場核對的部分,是「這一次 HTTP 有沒有把明文、口令或 fragment 金鑰當業務資料發出去」。它證明不了擴充功能沒讀剪貼簿,也證明不了下個版本行為不變。下面給出可重複的步驟,而不是新的形容詞。
一句話先回答搜尋意圖
瀏覽器本地加密,指加解密發生在你正在看的這個分頁裡:指令碼呼叫瀏覽器提供的 Web Crypto API,用 AES-GCM 一類演算法在本機完成加密,明文和金鑰預設不作為 HTTP 正文離開瀏覽器。核對方法不是讀行銷句,而是開啟開發者工具的 Network,用金絲雀搜尋,再必要時斷網複測。
這篇文章給開發者、維運,以及要把檔案或口令交給「線上工具」之前想自己看一眼的人。它不代替 檔案加密盒 的操作說明,也不重複首頁的產品定義。你要帶走的是一套換任何站點都能再用的檢查。
口號無法自證,流量可以觀察
很多頁面會寫本地計算、零上傳、端到端。這些詞可以印在真正本機算完的工具上,也可以印在「先 POST 原文,再由伺服器代加密」的上傳頁上。句子本身沒有校驗位。
你能當場看到的,是目前分頁發出的方法、地址、查詢串和請求體。Chrome 的 Network 面板會把它們列出來。如果你剛選中的檔名、剛輸入的口令,或一段只有你知道的實驗原文出現在這些位置,所謂本地加密在這一次操作裡就不成立。
反過來,面板裡沒有明文,只能說明你觀察到的這些請求沒有帶走這些欄位。它不能說明記憶體裡沒有明文,也不能說明瀏覽器擴充功能沒有讀取輸入框。把宣傳收成一次可重複的觀察,價值已經夠用:你可以對同事說「我搜過金絲雀,請求行和 body 是乾淨的」,而不是轉發一句官網文案。
不要用真實金鑰、證件號或未脫敏表格做實驗。準備一個可以丟棄的小檔案,口令用一次性長句。核對的是流量,不是把隱私再暴露一遍。
「本地」具體指哪一層計算
「瀏覽器本地」不是「這個域名看起來很安全」,而是「密碼學運算發生在目前文件的指令碼環境裡」。對 AES-256-GCM 來說,常見的正確路徑是 crypto.subtle.encrypt:金鑰派生、加密和認證標籤都走瀏覽器自帶的介面。MDN 寫明,SubtleCrypto.encrypt 只在安全上下文可用,生產環境就是 HTTPS;HTTP 普通頁上 crypto.subtle 往往是 undefined。
AES-GCM 被選中,不是因為名字好聽。它是帶完整性校驗的認證加密:密文被改過,或用錯金鑰,解密會失敗,而不是吐出一段「看起來像亂碼的錯誤明文」。演算法參數裡,IV 常用 12 位元組(96 位),這與 NIST SP 800-38D 對 GCM 的推薦一致;每次加密都應換新的隨機 IV,相同明文才會得到不同密文。
檔案場景可以寫成更具體的動作:你用檔案選擇器選出本機檔案,指令碼按塊讀進記憶體,逐塊加密,再觸發瀏覽器下載密文。下載到的 .lock 或 .enc 是本機產生的結果檔案,不是伺服器回執。單檔案上限如果寫成 5 GB,描述的是瀏覽器裡流式處理的能力,並不表示遠端收了 5 GB 原文。
還要把「業務上傳」和「頁面自己會發出的請求」分開。開啟即用的工具站仍會載入樣式、指令碼和字型,也可能傳送不含正文的造訪統計。這些請求的存在,不能用來指控「檔案被上傳了」。可是統計請求的 query 或 body 裡如果出現了你剛輸入的口令、待測密碼或清洗前原文,那就是另一回事。
FastPwd 把這條邊界寫成可核對的句子:密碼產生、密碼檢測、隱私清洗和檔案加解密的明文與金鑰預設不離開瀏覽器;閱後即焚只允許密文出站,解密金鑰放在 URL 的 # 片段。檔案加密盒按 1 MB 分塊、用 PBKDF2(100000 次、SHA-256)從口令派生 AES-256 金鑰,輸出 .lock / .enc。全部工具開啟即用,沒有帳號和密碼庫。承諾仍然只是承諾。下面用 Network 把它收成檢查項。
用 Network 做一次金絲雀檢查
先準備一枚不會出現在真實業務裡的標記。檔名可以用 canary-fp-20260825.bin,口令用一段隨機長句,正文裡寫一句只有這次實驗才有的話。金絲雀的作用是搜尋:在 Network 的過濾器裡貼上它,命中即失敗。
開啟開發者工具,切到 Network,勾選 Preserve log,過濾範圍先用 All,不要一上來只留 XHR。被取消或返回 4xx 的請求同樣可能已經帶上了明文。然後做一次完整操作:選檔案、輸入口令、點加密或產生。結束後先不要關面板。
- 在過濾器裡貼上金絲雀字串。有紅色命中就停下來讀那條請求,不必再做「感覺上像本地」的判斷。
- 沒有命中時,再逐條開啟 Fetch / XHR,對照請求行、查詢串和請求體。樣式、字型和指令碼可以忽略。
- 單獨過濾造訪統計路徑,開啟 query 與 body。頁面標題和路徑可以出現;剛輸入的口令、待測密碼、清洗前原文和檔案內容不應出現。
看請求行
完整 URL 裡的 path 和問號後面的查詢值得逐字看。id 這類定位欄位可以出現;檔名、口令、待測密碼、井號後面的金鑰不應該出現。把網址列整串和請求行對比:井號之後的部分如果進了請求行,說明實作把 fragment 錯用成了 query,或指令碼主動讀出後寫進了請求。
看請求體
POST / PUT 的 payload 是第二處。檔案加密如果聲稱本地完成,請求體裡不該有原檔案二進位,也不該有口令。閱後即焚可以有密文欄位,那是預期出站的資料;你要確認它看起來不像你剛輸入的原文。密碼檢測頁如果把待測密碼 POST 出去,無論目的寫成「查洩露」還是「算強度」,都已經離開了本機。
單獨看分析上報
造訪統計經常被忽略。主介面乾淨、上報卻帶著輸入框全文,這次操作仍不能算「明文留在瀏覽器」。過濾統計路徑時,不要假設「分析指令碼一定無害」——它只是另一類出站請求,檢查方式與業務介面相同。FastPwd 的造訪統計走站點自己的 tracker,localhost 預設不傳送;即便如此,你仍應用金絲雀確認上報裡沒有口令或檔案內容。
勾選 Preserve log。加密完成後如果頁面跳轉或重新整理,未勾選時第一條帶明文的請求可能已經被清掉,你會得到虛假的「面板是空的」。
斷網複測:靜態資源不等於業務上傳
第二項對照很便宜。先讓頁面完整載入,再在 Network 裡開啟 Offline,或直接關掉系統網路,然後加密那個可丟棄的小檔案。如果下載 .lock 仍然完成,說明這一次加解密不依賴即時介面。這是「瀏覽器本地加密」的強訊號,但不是唯一訊號。
假失敗也很常見:字型或分析指令碼在 Offline 下報紅,並不等於加密失敗。你要看的是加密按鈕之後有沒有新的業務 POST,以及結果檔案是否已經出現在下載目錄。假通過同樣存在:指令碼可以先把明文寫進佇列,等你重新聯網再發送。所以斷網要通過,聯網時還是要做金絲雀搜尋。
問號會進 HTTP,井號預設不會
URL 有兩段常被混在一起。問號後面的查詢會進入 HTTP 請求行,伺服器、反向代理和存取紀錄都能看見。井號後面的片段預設由瀏覽器留在本地,用來給目前頁面的指令碼讀。HTTP 請求目標不包含 fragment,這是 RFC 9110 對請求目標的約定,也是 URL.hash 只存在於瀏覽器側的原因。
因此,一次性密文連結如果把金鑰放進 #,接收方開啟 s.html?id={id}#{key} 時,伺服器按設計只能看到 id,看不到金鑰。這不是額外的加密協議,而是瀏覽器對 fragment 的預設行為。它有邊界:你把完整地址貼進工單、群聊或某些會丟掉 hash 的預覽卡片,金鑰就從「不進 HTTP」變成「出現在別人的螢幕和日誌裡」。
核對方法同樣具體:在 閱後即焚 建立一條無害測試文本,看建立請求的 body 是否只有密文;開啟閱讀頁時,看文件請求和後續介面的 URL 是否只含 id。網址列裡 # 後面的內容不應出現在這些請求裡。閱讀頁對接收方公開,不需要登入。
| 看哪裡 | 會不會進 HTTP | 怎樣算通過 |
|---|---|---|
| 頁面口號 | 不涉及 | 不能當證據,只作對照 |
| 請求行 / query | 會 | 無金絲雀、無口令、無 fragment 金鑰 |
| POST body | 會 | 無原文;焚鏈只允許密文 |
URL # 片段 |
預設不會 | 網址列有、請求行沒有 |
| 造訪統計 | 看實作 | 無輸入框原文 |
| Offline 後加密 | 無新業務請求 | 仍能下載密文;聯網後再搜金絲雀 |
你能證明什麼,不能證明什麼
這次檢查能支援的結論很窄,寫清楚反而更有用。
能支援:在你使用的這個瀏覽器、這個版本、這一次操作裡,明文、口令和 fragment 金鑰沒有作為已觀察到的 HTTP 業務資料或分析原文離開分頁。
不能支援:沒有別的分頁或擴充功能在讀剪貼簿;硬碟上的下載目錄是安全的;對方收到密文後不會截圖;密碼檢測覆蓋了全網洩露庫。如果檢測只做本地熵和一份公開弱口令 Top 列表,它只能回答「像不像常見弱口令」,不能回答「從未出現在某次洩露中」。那不是全網 HIBP 撞庫。
也不要把它理解成滲透測試。你沒有檢查 WebSocket、Service Worker 快取,也沒有逆向混淆指令碼。目標是讓自己能向同事解釋:我打開了 Network,用金絲雀搜過,請求行和 body 是乾淨的。這比轉發一句「官網說不上傳」更接近工程討論。
常見問題
斷網後還能加密,就能證明沒有上傳嗎?
只能證明這一次加解密不依賴即時介面。頁面已經快取的指令碼,仍可能在你恢復聯網後補發請求。所以斷網要通過,聯網時還要用同一枚金絲雀再搜一遍 Network。兩步都過,結論才站得住。
Network 面板是空的,等於這次操作安全嗎?
不等於。過濾條件只留 Img、沒勾選 Preserve log,或請求在跳轉時被清掉,都會造成假空白。先把過濾器改成 All,再搜金絲雀,並單獨開啟分析上報。空面板是觀察失敗,不是安全證明。
閱後即焚把密文放到伺服器,還算瀏覽器本地加密嗎?
算「明文在本機算完再出站」。伺服器只應看到密文和定位用的 id;解密金鑰放在連結的井號後面,預設不進 HTTP。建立和閱讀都不需要帳號。你要核對的是 body 裡是不是原文,以及請求行裡有沒有 # 後面的金鑰。
密碼檢測會把待測密碼送到全網洩露庫嗎?
FastPwd 的 密碼檢測 在本機算強度,並對照內建公開弱口令名單。待測密碼不上傳。它能抓住常見弱密碼,但不能證明「全網沒見過」,也不是 Have I Been Pwned 式撞庫。把待測密碼當作金絲雀搜 Network,就能核對這一條。
把同一套步驟用在開啟即用的工具上
若你希望用一個把計算邊界寫清楚的頁面來練習,可以從 FastPwd 的檔案加密盒開始。開啟即可使用,無需註冊。選一個不含真實隱私的小檔案,口令用金絲雀,加密後下載 .lock。同時盯著 Network:你應看到靜態資源和可能的造訪統計,不應看到原檔案或口令作為業務欄位。演算法是 AES-256-GCM,在 Web Crypto 裡算,單檔案不超過 5 GB。
閱後即焚適合練第二項:建立一條無害測試文本,確認出站的是密文;閱讀頁對接收方公開,連結形態是 s.html?id={id}#{key}。隱私清洗 適合練「原文會不會進統計」——連結和待脫敏文本按產品說明留在瀏覽器,清洗結果仍由你判斷是否夠用。
這些練習的目的不是證明某一個站點「絕對安全」,而是讓你把同一套核對步驟用熟。換任何聲稱本地加密的頁面,步驟不變:金絲雀、Preserve log、請求行、請求體、統計上報,必要時再加一次 Offline。
下次核對時記住三件事。第一,看流量,不看口號。第二,密文出站可以接受,金鑰和原文不行。第三,換瀏覽器、換版本、換功能後重新做一遍金絲雀搜尋。能重複的觀察,才值得寫進你們自己的安全說明。