文件站新增八個小工具,全部在讀者自己的瀏覽器裡執行¶
我們是一群關心匿名網路與網路自由的志工,從台灣出發,維運文件站,把個人隱私與匿名的做法依日常、敏感工作與高風險三種情境整理成可以照著操作的指引。
站上的文章說明怎麼保護自己,小工具區放的是可以直接按的東西。八個工具都在讀者的瀏覽器裡完成運算,不送出任何資料,存進裝置之後沒有網路也能使用。

起點是照片的 metadata¶
Metadata 是什麼那篇提到,照片裡帶著拍攝時間、相機型號與 GPS 座標,而上傳照片前先去 EXIF 是任何人現在就能做的低成本防護。
線上的清除工具幾乎都需要先把檔案傳上去,而需要清除 metadata 的人,正是最不該把原始檔交出去的人。密碼產生器、QR code 讀取器與網址清理器都有同樣的矛盾,要用的東西本身就是不該外流的東西。
把運算放回讀者自己的瀏覽器可以解決矛盾,代價是功能受限於瀏覽器能做到的範圍。需要連到外部服務才能運作的功能不會放進來,網路測量請用 OONI Probe,那是專門為量測設計的工具,資料的處理方式也公開。
八個工具看起來各做各的,收進來的判準只有一條:處理的東西本身就不該外流。照片裡的座標、剛產生的主密碼、還沒確認過的 QR code、可能被標記過的文件、答完就顯示你在防誰的清單,交給任何一台伺服器都說不過去。威脅模型清單與隱形字元偵測離清除 metadata 這個起點比較遠,收進來的理由相同。
八個工具共同的四條規則¶
- 在你的裝置上運算:所有工具都在瀏覽器中完成計算,不送出任何資料
- 斷網可用:存進裝置之後沒有網路也能使用,網域被封鎖、連線被切斷或身處沒有訊號的地方都可以開啟
- 原始碼公開:程式放在 anoni-net/docs 倉庫,具備能力的人可以自行驗證
- 需要 JavaScript:運算在讀者的裝置上進行,瀏覽器關掉 JavaScript 時整頁不會有反應
想自己確認第一條,最直接的做法是打開瀏覽器開發者工具的網路分頁,用任何一個工具處理一次資料,看有沒有請求送出去。整個過程不到一分鐘,比讀完原始碼快得多。
用 Tor Browser 的話有一個衝突¶
Tor Browser 的安全等級調到 Safest 會關閉 JavaScript,八個工具都無法使用。衝突在於,安全等級那一頁建議在遇到來路不明的釣魚連結與不熟悉的網域時把等級調高,而收到可疑連結正是最需要用隱形字元偵測或 QR code 讀取器檢查一次的時候。
可疑的網站用高安全等級開啟,把要檢查的文字或圖片複製出來之後切回 Standard,檢查完再調回去。工具不連外,在 Standard 等級下開啟不會增加你在可疑網站上的暴露。
開始之前,先答三題¶
威脅模型清單把「要保護什麼、要防誰、願意付出多少」三題答成一份可複製的純文字摘要,並列出建議先讀的頁面。分級與威脅模型如何建立一文完全一樣,資產四類、對手六級、成本三級。
三題各自看都合理,湊在一起未必,清單會把湊不起來的組合標出來。對手選到執法或國家級而成本填最低、要防親密關係的人卻沒把裝置列進要保護的東西、只防隨意路人卻打算大改工作流程,都在標記的範圍裡。

答案只留在該分頁裡,不寫進 localStorage、不寫進 IndexedDB、不寫進 cookie,重新整理就回到空白。「我要防的是親密關係的人」寫在裝置上正好是最不該留的紀錄,而裝置很可能就在對方的接觸範圍內。要保存一份就按複製摘要,貼到自己選的地方。tools/test_threatmodel.mjs 有一項測試守著不落地這件事,避免日後有人為了體驗方便順手加上儲存。

剛加入一個團體、被交代注意資安卻不知道從哪開始的時候,最適合打開清單。換工作、換城市、開始參與新議題,或經歷一次資安事件之後,回頭再答一次。
要交給別人的東西¶
密語與密碼產生器¶
密語與密碼產生器從 asian-diceware 的 7776 字詞表抽密語,或從勾選的字元集抽隨機密碼。兩個模式的亂數都來自 crypto.getRandomValues,取樣時將無法整除的部分捨棄重抽,讓每個字被抽中的機率完全相同。抽六個字的熵約為 77.5 位元,畫面會直接顯示熵值。

懷疑手邊的電腦被人動過的話,切到實體骰子模式。詞表的順序本身就是編碼,第一個字是 11111,最後一個是 66666。擲五顆骰子按下畫面上的數字即可查出一個字,隨機性來自你自己的手,程式只剩查表的工作。按下載完整對照表會取得一份 7776 行的純文字檔,印出來之後不必再開啟工具。

申請密碼管理器要設主密碼、加密磁碟等長期不換的密碼,都適合在此產生。複製之後記得用一段無關的文字覆蓋剪貼簿,手機上的剪貼簿常常跨 App 共用。
QR code 產生器¶
QR code 產生器將很長又容易打錯的字串轉成 QR code,讓眼前的人用相機讀取。活動報名連結、講義的下載網址、臨時的聯絡方式都適用,56 個字元的 onion 網址與一行含 IP 與指紋的 Tor bridge 也在其中,中間不經過任何伺服器,也不留下訊息紀錄。

QR code 裡面是明文,任何拍到圖的人都能讀出內容,包括牆上的攝影機與你身後的人。真正需要保密的內容應該用端對端加密的通訊工具傳送。要印在紙上時將容錯度調到 Q 或 H,紙會摺也會髒。
現場要把一個連結交給眼前的人,而網路不方便使用的時候最適合。帶工作坊把一行 bridge 交給參加者是典型的例子,唸出來兩邊都不確定剛才是大寫 O 還是數字 0,改用 QR code 讓對方掃描,一次就對。
收到來路不明的東西時¶
QR code 讀取器¶
QR code 讀取器在瀏覽器中解出圖片裡的內容,圖片不離開裝置。解出來是網址時會將主機名獨立標出,並且刻意不提供開啟按鈕,確認主機之後再自行貼進瀏覽器。

Wi-Fi 設定、兩步驟驗證綁定、預先寫好的信與簡訊、地理座標、電子名片都能辨識,欄位會拆開來標記,密碼預設遮蔽。掃到 nopass 的 Wi-Fi、含 secret 的 otpauth:、javascript: 開頭的內容都會另外提醒,那幾種按下去的後果與掃到一個普通網址差很多。
停車繳費機上貼著一張看起來沒有異狀的 QR code,或剛認識的人遞來印著 QR code 的名片,都適合先確認內容再決定要不要照做。
隱形字元偵測¶
隱形字元偵測找出文字裡的零寬字元、方向控制、標籤字元與混在拉丁字母裡的同形字,標出位置並說明每一類是什麼。

機構發文件給二十個人、每一份在不同位置插入不同組合的零寬字元,內容看起來完全一樣,外流之後比對即可知道是哪一份。記者取得文件向機構查證時出示原件或複製貼上其中一段,等於把消息來源交給正在找他的人。完整的場景見記者保護消息來源。
不可見字元的另一個用途是把整段指令藏進看起來正常的文件裡。人讀不到,模型讀得到,把一段來路不明的文字貼給 AI 助理之前掃描一次,成本十秒。
偵測結果能證明「有」,不能證明「沒有」,零寬字元是最粗糙的一種標記方式,同義詞替換、段落空白行數、標點微調、PDF 裡的字元間距都不會被偵測到,彩色雷射印表機還會在每張紙上留下編碼序號與時間的黃點陣列。處理真正敏感的文件時,正確的做法是重新打字或轉述內容,不要傳遞原始檔案。
社群的立場是教偵測、不教植入,同一組零寬字元,機構用來保護內部文件是合理需求,用來找出吹哨者就是壓迫工具,所以工具不提供產生帶標記副本的功能,示範文字也固定,無法換成自己的文字。
送出去之前先清一次¶
檔案 metadata 清除器¶
檔案 metadata 清除器移除 EXIF、XMP、IPTC、製作軟體與註解欄位,檔案不離開裝置,清完的是新的一份,原始檔不會被更動。處理範圍是 JPEG、PNG、WebP、GIF、MP4、MOV 與 PDF,遇到認不出來的檔案,畫面上會直接標示,不會安靜地交回一份沒有處理過的東西。

照片與影片的壓縮資料從檔案裡的固定位置一路照抄到檔尾,一個位元都沒有變動,清完的檔案解出來與原檔完全相同。重新編碼的工具做不到無損,每一次重新壓縮都會損失畫質,而且會在輸出裡留下自己的處理痕跡,用 mat2 清過的檔案可以辨識出是 mat2 清的。
EXIF 裡還有一張沒有被裁切過的縮圖。照片裁掉一半再傳出去,縮圖可能仍是原本的完整畫面。畫面上會逐項列出移除與保留的內容,含各自佔幾個位元組,以及檔案格式裡對應的段落代號。
iPhone 預設拍出來的 HEIC 還無法處理,可以在「設定 → 相機 → 格式」選「最相容」,之後拍的就是 JPEG。TIFF、RAW、MKV、WebM、AVI 與 Office 文件目前也不在範圍內。工具不做臉部模糊,畫面裡的門牌、路標、制服與窗外景色都在影像本身,分享之前自行檢視一次。
網址清理器¶
網址清理器挑出網址裡的追蹤參數並移除,每一個都說明是誰在追蹤,同時拆掉 Google 與 Facebook 的轉址包裝。

移除的邏輯是白名單,只處理清單裡能辨識的參數,其餘一律保留。反過來做的話,YouTube 的影片 ID 與分頁參數會一起被刪除,讀者會取得一個打不開或指向錯誤內容的網址,而且不會聯想到是清理工具改壞的,只會覺得對方給錯了連結。
從 Facebook 點開文章再複製出來的網址帶著 fbclid,貼進群組之後,每個點進去的人都會帶著同一個 ID 回到 Meta,同一個 ID 將整串點擊記錄串了起來。電子報的 utm_source 轉發出去等於告訴收件人你訂了哪份電子報,mc_eid 更直接,屬於 Mailchimp 的收件人識別碼,對得回電子郵件地址。
短網址刻意不展開,因為展開的動作會把想清理的網址送到第三方伺服器上,正好是工具要避免的事。
想知道自己的瀏覽器透露什麼¶
你的瀏覽器透露了什麼列出任何網站在打開頁面的那一刻就能取得的資訊,沒有問過使用者,也不需要同意。每一項下面標出 Tor Browser 會顯示什麼,例如時區直接寫「Tor Browser 會顯示:UTC」,換一個瀏覽器打開同一頁就可以對照。

最上面的八位短碼是將穩定的值揉在一起算出來的,換裝置或換瀏覽器再開一次,只要比對短碼就知道有沒有變。十五項值加起來足以認出一個人,短碼把整組值濃縮成一個可以直接比對的識別碼。原理見瀏覽器指紋是什麼。
列出的十五項裡,在自己裝置上真正能夠關閉的只有三項,位置權限、語言偏好與 Do Not Track 訊號。其餘沒有開關可以關,因為它們本來就是網頁平台提供給網站的能力。單一動作能處理最多項目的是改用有內建防護的瀏覽器。
工具刻意沒有匯出按鈕,匯出的檔案本身就是一份完整的指紋,留在裝置上比不留更糟。也沒有獨特性百分比,計算獨特性需要一個母體資料庫,社群不打算為此開始收集訪客資料。想看那種統計可以用 EFF 的 Cover Your Tracks。
影片與 PDF 各有一個限制¶
編碼器會把自己的版本寫進壓縮資料本身,與畫面內容混在一起,不屬於描述欄位,要移除只能重新編碼,而重新編碼會損失畫質,也只是把舊編碼器的痕跡換成新的。工具不做重新編碼,改成把掃到的字串列出來,避免使用者誤以為已經清乾淨。
照片與影片可以把描述那一段直接剪掉,PDF 不行。PDF 的每個物件在交叉索引表裡記著自己的位置,剪掉一段之後後面全部位移,整張表要重算,而 1.5 版之後常見的做法還會把好幾個物件壓進同一段壓縮資料,從外面連內容都看不到。所以工具是把整份檔案重寫,無損的保證在 PDF 上不成立。實測頁面內容不會重新排版,渲染出來與原檔逐像素相同,但表單、數位簽章或特殊互動元件重寫之後不一定完全保留,重要的檔案先留一份原始檔。
XMP 另有一個陷阱,把文件目錄裡指向 XMP 的引用刪掉、重新存檔之後,內容仍然完整留在檔案裡,只是沒有人指向它,用文字搜尋工具打開還是找得到作者與地點,所以工具是把物件本身移除,tools/test_stripmeta.mjs 有一項測試專門守著。
整份文件站可以存進裝置¶
用一般瀏覽器開過文件站之後,目前語言的核心章節(概念、工具、進階、在地)會在背景保存到裝置的快取裡,不需要另外安裝任何東西。切換語言時才會下載該語言的章節,所以裝置上只會有實際讀過的語言。

記者、行動者、LGBTQ、家暴等場景頁不在預先下載的範圍內,只有自行點開過才會保存。場景頁留在裝置上本身可能就是敏感訊號,所以是否留存交給讀者決定。要離線帶著走的話,在離線閱讀頁的清單裡自行勾選。
自動保存的章節預設只存文字,離線開啟會缺圖。頁面上有一個選項可以連同核心章節的內文圖一起保存,大約多 7 MB。預設關著是因為多數人在行動網路上,而缺圖仍然讀得懂大部分內容。自行勾選的頁面不受該選項影響,一律連內文圖一起保存。
文件站也可以安裝成離線 App,Android、桌面瀏覽器與 iOS 的逐步操作寫在離線閱讀頁。Tor Browser 以及 onion、IPFS 版基於隱私考量不註冊背景的 Service Worker,需要離線備援時用一般瀏覽器在 anoni.net 安裝,平時的匿名瀏覽再回到 Tor Browser。
用了誰的程式¶
這一區大部分的程式是社群自己寫的。有四樣東西來自別人,原封不動放進來,不做任何修改:
| 元件 | 用在 | 授權 |
|---|---|---|
| qrcode-generator 1.4.4 | QR code 產生器 | MIT |
| jsQR 1.4.0 | QR code 讀取器 | Apache-2.0 |
| pdf-lib 1.17.1 | metadata 清除器的 PDF 部分 | MIT |
| asian-diceware 的 7776 字詞表 | 密語與密碼產生器 | 詞表 CC-BY-4.0,程式 MIT |
不做修改是刻意的,改過就失去「這是上游那一份」的可審性,讀者要驗的時候只能相信我們的說法。檔案都在 utils/vendor/ 底下,可以自己跟上游的版本比對。共通的理由是元件寫錯不會讓程式停下來,只會產生看起來正常但實際上錯的結果,那比壞掉更難發現。
想一起做的話¶
工具是純前端,沒有建置流程,程式在 anoni-net/docs 的 docs/zh-TW/js/ 底下,一個工具一支 JS。改完要在本機看效果,執行 cd docs && uv sync && mkdocs serve 即可。
八個工具各有一支測試,執行方式是 node tools/test_<名稱>.mjs,不需要安裝任何套件,每一支都在 CI 裡執行。測試守的是畫面看起來正常、結果卻是錯的那幾種情況:取樣有沒有偏差、產生的 QR code 掃回來內容對不對、指紋示範頁有沒有偷偷送出資料、網址清理有沒有誤刪必要參數、威脅模型的答案有沒有被寫進儲存。
目前缺的東西列在各工具頁的不支援清單裡,HEIC、TIFF、RAW、MKV、WebM、AVI 與 Office 文件都還沒有人做。著手之前先開一個 issue 或到 Matrix room 說一聲,避免兩個人做同一件事。流程見 CONTRIBUTING 與如何參與與認領主題。
接下來¶
社群想往的方向是讓文件站成為一份存在讀者自己裝置上的隱私與匿名指引。網域被封鎖、連線被切斷、身處沒有網路的環境,正是最需要開啟文件的時候,能否開啟取決於之前有沒有先保存下來。
幾件現在就可以協助的事:
- 希望能離線帶著走的頁面:預先下載的範圍目前依核心章節劃分,實際需求可能不同
- 工具在你的情境下缺了什麼:某個欄位沒有被辨識、某種檔案格式無法開啟、說明看不懂都算
- 影片或 PDF 的實際案例:手上有無法清除 metadata 的檔案,或清完之後無法開啟的檔案,都歡迎回報
回報管道是 Matrix 公開 room(家伺服器 im.anoni.net,連結見社群工具頁),或 anoni-net/docs 的 issue。不方便具名的部分可寄到 whisper@anoni.net(GPG 公鑰)。