字串脫敏

在把 API 金鑰、令牌、郵箱和賬號貼上到工單或聊天前先做遮蔽。可設定保留開頭與結尾的字元數、遮蔽字元,以及是否隱藏真實長度。

分享金鑰的「樣子」,而不是金鑰本身。 貼上令牌、金鑰、郵箱或賬號,選擇開頭和結尾各保留多少字元。中間部分會被替換為遮蔽字元,同事可以確認你指的是哪一份憑證,卻永遠看不到它。

脫敏不是加密。如果金鑰已經洩露,請輪換它,而不是把它打碼。

脫敏是分享工具,不是安全控制

脫敏究竟保護了什麼

把憑證的中段塗掉,能很好地解決一個很窄的問題:讓你在不傳輸金鑰的前提下談論它。工單、缺陷報告、截圖和聊天記錄一直在洩露憑證,而起因往往只是有人需要確認「用的是哪一個」金鑰,而不是「金鑰是什麼」。展示 sk_live_51H8...FgH 完整回答了前一個問題,對後一個則隻字未提。

這就是它的全部價值,因此有必要把邊界說清楚。脫敏是為人際溝通所做的單向、有損變換。它不是加密,因為沒有金鑰、也不打算還原;它不是雜湊,因為它並不為抵抗什麼而設計。它更像小票上只打印銀行卡後四位:足以識別,不足以使用。

該露出多少

每多露一個字元,攻擊者就少猜一個字元,所以在能完成識別任務的前提下,前後綴越短越好。對長隨機令牌來說,兩端各留四個字元是合理的預設值,多數服務商的控制台也是這麼顯示的。對短值要留得更少:八位 PIN 露出四位,幾乎就什麼都沒剩下。

結構化的值需要額外斟酌,因為可見部分可能比看上去更有資訊量。許多 API 金鑰帶有含義明確的字首,而 sk_live_sk_test_ 的區分,通常正是你想保留的。郵箱地址則是相反的陷阱:保留域名一般沒問題,但本地名加上一個小域名往往能定位到具體某個人,於是脫敏後的字串又變回了個人資訊。

本工具不允許首尾兩個視窗重疊。如果兩項設定加起來會覆蓋整個字串,它會自動收縮——因為重疊遮蔽的失敗後果,是把原值完整打印出來。

長度洩露與固定寬度

保留長度的遮蔽也保留了資訊。星號的個數會準確告訴讀者金鑰有多長,這既縮小了暴力破解的範圍,也可能直接暴露憑證型別,因為很多金鑰格式長度固定。對密碼而言,公開長度是實實在在的讓步。

固定寬度選項會把整個中段替換為固定數量的遮蔽字元,無視真實長度,於是所有脫敏結果看起來一樣長。只要輸出會被團隊之外的人看到,就該啟用它。當你和同事一起排查、長度本身具有診斷價值時(例如懷疑環境變數被截斷),再使用保留長度的預設行為。

最後,請把它當作一個排版步驟,而不是事故響應。如果一個仍然有效的金鑰已經出現在工單、日誌或程式碼倉庫裡,給副本打碼不會改變原始洩露的事實。請先輪換憑證,之後再對要貼上的內容做脫敏。

開源說明:使用原生 JavaScript 實現,不依賴第三方庫。

常見問題

脫敏後的文本能還原嗎?
不能。被遮蔽的字元是被丟棄而不是被編碼的,沒有任何可解碼的內容,只剩下你選擇保留的可見字元。
應該保留多少個可見字元?
在仍能識別的前提下越少越好。長隨機令牌兩端各留四個比較合適;像 PIN 這樣的短值應更少甚至完全不留。
固定寬度有什麼作用?
它用固定數量的遮蔽字元替換中段,因此輸出永遠不會暴露真實長度。任何要分享到團隊之外的內容都建議開啟。
我的輸入會發送到伺服器嗎?
不會。遮蔽完全由瀏覽器中的 JavaScript 完成,這也是可以放心在這裡貼上有效憑證的原因。
可以在遮蔽郵箱的同時保留辨識度嗎?
可以,保留結尾字元即可讓域名留存。但要注意:較短的本地名加上小域名,仍可能定位到具體某個人。
金鑰洩露了,打碼就夠了嗎?
不夠。脫敏隻影響你即將分享的這份副本。請先輪換已洩露的憑證,之後再對新訊息使用脫敏。