免註冊的文字隱寫術,是指將一段簡短的秘密訊息隱藏在外觀普通的掩護文字中,之後再透過完全在你的裝置上執行的瀏覽器工具將其還原,無需帳號、無需付費,也無需上傳。文字隱寫術工具正是如此運作:它接收一段普通句子和一個獨立的隱藏 UTF-8 訊息,在第一個可見字元之後插入零寬度 Unicode 碼位來編碼酬載,並產生一個在大多數字型中仍會呈現為原始句子的單一字串。當你將該字串貼回還原模式時,工具會定位框架化的酬載,驗證其僅由文件化的位元符號組成,檢查位元數是否為 8 的倍數,將位元組解碼為 UTF-8,並同時回傳隱藏訊息與還原的可見掩護文字。一切都在瀏覽器中於本機端執行,這就是為何完全不需要註冊:沒有伺服器端帳號需要建立、沒有個資需要管理,而且掩護文字或秘密文字都不會離開你的裝置。編碼方式已公開記錄,因此它提供的是隱蔽性而非機密性,任何知道該慣例的人都能解碼。

瀏覽器工具的功能
兩種模式涵蓋完整的來回流程。隱藏模式接收可見的掩護句子和獨立的隱藏訊息,將隱藏位元組編碼為一串不可見字元,並回傳一組可複製的隱寫字串。還原模式接收該字串並反向執行流程:找出起始與結束標記,檢查位元符號,將位元解碼回 UTF-8 位元組,並並列印出還原的隱藏訊息與復原的掩護句子。由於每個步驟都在你目前分頁中的 JavaScript 內執行,掩護文字與秘密從未傳送到遠端伺服器,因此不需要註冊、驗證電子郵件或儲存權杖。該工具也明確說明自身慣例,並未宣稱能與網際網路上所有其他隱寫術網站相容,這正是讓來回驗證可靠的關鍵。
可見的結果值得檢視。渲染後的句子看起來仍像原始內容,但底層的碼位序列長得多,因為每個隱藏位元組已展開為 8 個不可見字元加上 2 個框架標記。字元計數器或差異工具會立即揭露這些新增內容,因此這是隱蔽而非偽裝:它能躲過只查看渲染後文字的隨意讀者,但無法躲過將字串複製到檢查器中的人。這種取捨是有意為之,也是為何該慣例會以純文字形式記錄在同一頁面上。
零寬度編碼的運作方式
該工具使用 4 個不可見 Unicode 碼位以及明確的框架機制。一個獨特標記告訴還原模式酬載從何處開始,第二個獨特標記告訴它酬載於何處結束,框架區域內僅允許兩種位元符號。文件中規定的集合之外的任何字元都會導致還原步驟失敗而非猜測。
| 碼位 | 名稱 | 在慣例中的角色 |
|---|---|---|
| U+200B | 零寬度空格 | 代表二進位 0 位元 |
| U+200C | 零寬度非接合符 | 代表二進位 1 位元 |
| U+2063 | 不可見分隔符 | 標記隱藏酬載的開始 |
| U+2064 | 不可見加號 | 標記隱藏酬載的結束 |
每個隱藏的 UTF-8 位元組正好以 8 個不可見位元寫成,採用最高有效位元優先的順序,依序對應到 U+200B 與 U+200C。以 U+2063 與 U+2064 包裹的框架序列會插入掩護文字的第一個可見 Unicode 碼位之後。還原模式在產生輸出前會套用 3 項檢查:找出標記、確認每個酬載字元都是兩種位元符號之一、要求位元數為 8 的倍數,並在產生的位元組序列不是有效的 UTF-8 時拒絕解碼。它也會擷取第一個有效的框架區段,並回傳還原的可見掩護文字,讓你能確認框架外的位元組未被動過。
此設計的一項實際後果是位元膨脹率。一個隱藏的 ASCII 字母佔 1 個 UTF-8 位元組,因此其成本是 8 個不可見字元加上 2 個標記,共 10 個不可見碼位。一個隱藏的 emoji 或 CJK 字元可能佔 3 或 4 個 UTF-8 位元組,也就是每個字符 24 到 32 個不可見字元。這就是為何隱藏訊息與掩護文字都設有明確的大小上限:這能維持 DOM 的回應速度,並避免結果膨脹。
在掩護文字中隱藏訊息並還原
來回流程雖然簡短,但每個步驟都很重要,因為不可見字元正是容易被過於積極的軟體吞掉的資料類型。請將下列步驟視為檢查清單,特別是第 2 步與第 3 步。
- 輸入掩護文字與隱藏訊息,然後產生隱寫字串。在隱藏模式下,於掩護欄位中輸入或貼上一段普通句子,並於隱藏欄位中輸入你想隱藏的訊息。工具會將你的隱藏 UTF-8 位元組編碼為 8 位元一組的 U+200B 與 U+200C,以 U+2063 與 U+2064 包裹,並將框架區域插入掩護文字的第一個可見碼位之後。輸出是一段可直接複製的字串。
- 透過能保留零寬度 Unicode 字元的管道複製精確的結果。將產生的字串貼到目的地時,請使用你預計用於傳遞的相同文字路徑:純文字編輯器、程式碼片段、Markdown 檔案或原始文字管道。請避免會自動格式化的所見即所得編輯器、將文字轉成像素的螢幕擷圖,以及已知會移除預設可忽略碼位的平台。若你是首次測試新管道,請將字串貼到該處、複製回來,並立即執行還原以確認位元是否存活。
- 將其貼入還原模式,並驗證隱藏訊息與還原的可見掩護文字。開啟還原模式,貼上字串(請勿重新輸入或清理),然後讀取還原的隱藏訊息與還原的掩護文字。若擷取失敗,原因幾乎一定是某個不可見字元在傳輸過程中被移除或替換。此時請比較你送出內容與送達內容的原始碼位,以找出是哪個應用程式將其變更。
會移除隱藏位元的清理器與傳輸管道
不可見字元正是許多軟體被設計來移除的碼位。社群網路、電子郵件閘道、聊天用戶端、內容管理系統與剪貼簿管理程式經常會將文字標準化、篩選或重新序列化,而預設可忽略的碼位常成為目標。根據 Unicode 安全考量報告,預設可忽略字元在處理過程中可能會被忽略、移除或替換,而不會改變字串的視覺呈現,這正是它們在隱寫術中便利、卻在傳輸中脆弱的原因。即使只有一個隱藏位元消失,酬載就會變得畸形,並可能解碼為不同的位元組,或完全被拒絕。
有些管道明顯比其他管道更安全。以 UTF-8 儲存檔案且不會自動取代不常見字元的純文字編輯器,通常能保留完整的酬載。直接檔案傳輸、程式碼儲存庫,或會回應你所送位元組的原始文字 API,通常能保留不可見碼位。螢幕擷圖與列印副本根本無法承載不可見碼位,因為沒有位元組可供承載;文字已變成像素。所見即所得編輯器、文書處理器以及許多通訊用戶端會在你貼上時靜默地移除零寬度字元,這就是為何前述操作步驟中的第 2 步包含在信任新管道前的來回檢查。
若在傳輸後擷取失敗,最快的診斷方式就是檢查原始碼位。大多數開發者工具能以 U+ 跳脤序列的形式顯示字串;比較送出與接收的序列就能告訴你目的地移除或變更了哪些碼位,接著你就能決定要切換管道,或是接受所選管道將無法承載酬載。
限制,以及文字隱寫術「不是」什麼
兩項硬性限制讓介面保持回應速度。隱藏訊息上限為 10,000 個 UTF-8 位元組,掩護文字上限為 100,000 個碼位。由於每個隱藏位元組會變成 8 個不可見碼位加上 2 個標記,產生的字串可能會比原始掩護文字長得多,特別是當隱藏訊息包含 emoji 或其他每個字元佔數個 UTF-8 位元組的非拉丁文字時。此外還有一項結構性規則:掩護文字不得已包含本慣例所使用的起始或結束標記,因為接受這些標記會讓酬載邊界變得模糊。落在框架區域之外的普通零寬度字元仍會保留為可見掩護文字的一部分,不會被解讀為酬載位元。
該工具也明確說明了它不提供的項目。隱寫術無法提供機密性、真實性或完整性:任何知道或偵測到該對應關係的人都能解碼訊息,而任何人都能竄改它。視覺上的相等並不代表位元組上的相等,而頁面上的測試僅證明本慣例的來回運作,並非證明能通過任何外部服務存活。一旦傳遞路徑上的任何清理器移除了預設可忽略的碼位,隱藏訊息就會消失。請將本工具用於學習 Unicode 如何承載不可見資料、建構無害的謎題,以及測試某個平台是否會移除不可見字元。任何需要保持機密的資料,請先使用經過審核的系統進行加密,再僅以本頁面來隱藏已加密的酬載;絕對不要用本工具隱藏憑證、有害的指示、個人資料,或違反平台規則的內容。
若你在權衡選項,如何手動將文字逐位元組轉換為二進位有詳細說明。
若你在權衡選項,文字轉十六進位範例:UTF-8 位元組在實務中的樣貌有詳細說明。