當 Nano ID 產生器完全在您的瀏覽器中使用 W3C Web Crypto API 來產生隨機數、套用 Nano ID 的無偏誤拒絕抽樣演算法,並且永不傳輸其所產生的識別碼時,它就是一個可以安心在線上使用的工具。對於此類工具而言,有三項特性決定了安全性:隨機來源必須是密碼學上足夠強的、從隨機位元組到字母符號的對映必須是均勻的,以及該工具不得將輸入、輸出或使用資料外洩到遠端伺服器。Nano ID 產生器滿足了所有這三項條件。其隨機來源為 window.crypto.getRandomValues,這是 W3C Web Cryptography API 為產生密碼學上強健的位元組所定義的 Web Crypto 基本介面,而其符號選擇遵循官方 Nano ID 專案的拒絕抽樣方法,可防止 64 個符號 URL 字母表上的模數偏誤。每個批次都是在當前的分頁中產生、檢查重複並顯示。除非您自行複製或貼上,否則不會有任何資料離開您的裝置。這道界線將威脅模型從遠端操作者轉移到瀏覽器、裝置以及在該頁面上運行的任何擴充功能,這對於應用程式識別碼而言是合適的,但對於憑證、還原碼或任何作為秘密使用的值來說則不適用。

is nano id generator safe to use online
線上使用 Nano ID 產生器安全嗎?

對線上 Nano ID 產生器而言,「安全」代表什麼

對於任何基於瀏覽器的產生器,安全問題都可以歸納成一份簡短的檢查清單。如果該工具在任何一項上失敗,那麼「它是否安全」這個問題的答案就會從「是」變成「視情況而定」再到「否」。那些將此問題視為單一二分法的評論者,通常會忽略部分安全的工具仍對特定用途不安全,以及一個技術上對某項工作安全的工具,仍可能對另一項工作構成危險的情況。

安全特性應檢查的項目Nano ID 產生器的狀態
隨機來源密碼學等級的 PRNG,而非 Math.random 或時間戳記使用 window.crypto.getRandomValues
符號對映採用拒絕抽樣,而非天真的位元組模數運算遵循官方 Nano ID 演算法
網路行為不上傳識別碼、長度、數量或使用事件純用戶端,不發出任何請求
字母表權威性符合官方 Nano ID 的 64 個符號集合大寫、小寫、數字、底線、連字號
偏誤控制依字母表大小調整的遮罩與捨棄方法測試鎖定具代表性的字母索引

當這五個項目全部通過時,該工具對於非秘密的應用程式識別碼是安全的。當任何一項失敗時,結果就會以在生產環境中至關重要的方式變得無法預測。一個使用 Math.random 的產生器仍可能產生視覺上隨機的字串,但其輸出可以被任何能觀察到少量樣本並重建內部狀態的人重現。一個將識別碼上傳到伺服器的產生器,則會將每個短網址代稱、檔案名稱或分享權杖交給應用程式擁有者無法稽核的第三方。一個使用天真模數運算將位元組對映到自訂字母表的產生器,會不知不覺地偏袒某些符號,並縮小實際有效的識別碼空間。

Nano ID 產生器如何將產生過程保留在本機

用戶端產生是該工具所有安全聲明的基礎。頁面載入 JavaScript、在您的分頁中執行它,並且從不以識別碼內容呼叫任何遠端端點。其相依套件鏈非常小:官方 Nano ID 專案發佈的演算法、瀏覽器內建的 Web Crypto 基本介面,以及頁面自身的驗證與重複檢查。沒有第三方分析端點、沒有日誌記錄服務、沒有遙測信標,也沒有遠端設定來源。如果裝置上掛載了網路監控器,在產生期間它不會看到任何識別碼位元組離開該分頁。

這個隨機基本介面為 window.crypto.getRandomValues,在 W3C Web Cryptography API 規範中被定義為密碼學上強健隨機位元組的來源。瀏覽器透過作業系統的熵池支援該方法,該熵池混合了硬體噪訊、時間抖動以及其他來源。那些改呼叫 Math.random 的天真工具,則依賴於非密碼學等級的 PRNG,其輸出可在觀察少量樣本後被建模。Nano ID 專案在其 官方儲存庫中記錄了這項區別,而本產生器遵循了這一點:明確避開了 Math.random、時間戳記、計數器、瀏覽器指紋以及確定性種子。

均勻的符號選擇是第二項技術特性。預設字母表包含 64 個唯一符號,因此其索引恰好適合用六個位元表示。一種天真的實作方式是取出一個位元組然後計算 byte % 64,這種方式之所以均勻,是因為 256 可以被 64 整除,但真正的偏誤問題出現在字母表不是 2 的次方冪時,例如包含 62 或 58 個符號的自訂集合。本產生器透過 Nano ID 的拒絕抽樣方法來處理這個問題:它根據字母表大小建立一個位元遮罩,忽略任何落在字母表範圍之外的遮罩值,並持續抽取直到達成所要求的長度。這能確保無論應用程式日後切換到哪種字母表,每個字元的機率都保持相等。

安全地產生 Nano ID:逐步操作指南

  1. 在您的瀏覽器中開啟 Nano ID 產生器,並在產生任何內容之前確認網址列顯示的是正確的網域。
  2. 選擇介於 1 到 128 個字元之間的識別碼長度。除非您有經過評估的理由需要變更,否則請將預設值保留為 21,因為該預設值符合 Nano ID 專案的一般 API,並能與預期使用該長度的程式庫順暢整合。
  3. 根據當前任務所需的識別碼數量,將數量設定在 1 到 100 之間。較小的批次更容易用肉眼檢查是否有任何明顯的問題。
  4. 點擊產生動作並等待結果出現。頁面會透過 window.crypto.getRandomValues 抽取隨機位元組,根據官方 64 個符號的字母表套用拒絕抽樣,並在顯示該批次之前執行內部的重複檢查。
  5. 以換行分隔的文字格式複製結果,並在受信任的編輯器中檢查它。確認每個字元都屬於該字母表,並且批次中沒有任何值出現兩次。
  6. 在單一交易中將該批次貼入您的持久資料儲存區。在識別碼欄位上新增唯一約束 (unique constraint),讓資料庫拒絕任何在頁面內檢查中漏網的衝突。
  7. 處理罕見的資料庫衝突時,請僅重試失敗的建立作業,絕不要靜默地重新產生整個批次,這樣先前建立的資料列才能保持穩定並易於稽核。

什麼時候 Nano ID 產生器不是合適的工具

強健的隨機性並不會將識別碼變成身分驗證憑證。使 Nano ID 適合作為資料庫主鍵的同一個演算法,也使其不適合作為面向使用者的憑證,因為兩者在生命週期、儲存、輪替和暴露要求上完全不同。如果一個 Nano ID 被應用程式記錄下來、以明文儲存,或被送入分析管道,失敗模式通常是某個資料庫資料列外洩。如果一個密碼被記錄下來、以明文儲存,或被送入相同的管道,失敗模式則是每個重複使用該密碼的服務都遭到帳號接管。

  • 密碼與通關密語:在目標平台上產生、使用像 Argon2id 這類記憶體硬性演算法進行雜湊處理,並且絕不儲存原始值。
  • API 金鑰、OAuth 用戶端密鑰以及 webhook 簽署密鑰:在發行平台自家的密鑰管理器中產生,並依照固定週期進行輪替。
  • 還原碼與雙因素備份字串:透過驗證器自身的註冊流程產生,而非透過第三方頁面。
  • 加密金鑰與簽署材料:在硬體安全模組 (HSM)、由 HSM 支援的雲端 KMS,或作業系統的金鑰鏈中衍生。
  • 具有高貨幣價值的會話權杖:由能夠撤銷、使其過期並稽核的強化伺服器來發行。

相同的推理也適用於任何成為授權決策一部分的識別碼。一個可猜測的 URL 代稱會造成拒絕服務風險。一個可猜測的、且能授予私有資源存取權的權杖,則會造成權限提升風險。隨機性能提高猜測的成本,但並不能免除對獨立存取控制層的需求。請將任何用於保護資源的 Nano ID 視為其值最終會被公開,因為營運事故終究會洩漏值,並根據該假設來設計存取政策。

將 Nano ID 整合到您的技術堆疊中而不產生意外

產生之後最常見的安全回歸發生在整合階段。一個 21 字元的 Nano ID 包含大寫字母、小寫字母、數字、一個底線和一個連字號。儲存、傳輸和呈現層各自對這些字元的意義有不同的詮釋,而這些詮釋有時會互相衝突。一個安全的產生器只有在周圍的系統保留每個字元時才能持續保持安全。

請將識別碼儲存在能保留大小寫以及兩個標點符號的欄位中。預設字母表避開了斜線、加號、等號和空白字元,因此 URL 安全性是內建,但一個會將字串轉為小寫的資料庫定序規則,會在不知不覺中將 "Abc-XYZ" 與 "abc-xyz" 合併,並在儲存層而非應用程式層破壞唯一約束。相同的問題也會出現在將識別碼視為大小寫不敏感權杖的日誌處理器中。

請測試每個接觸到該識別碼的路由、日誌行、分析呼叫、CSV 匯出以及 HTTP 用戶端。一個會對連字號進行百分比編碼的框架是無害的,但一個會去除或重寫底線的框架則會改變該值並破壞查找。關於長度,預設的 21 個字元在任何應用程式行為被納入考量之前,提供了 21 個字元 × 每字元 6 個位元 = 126 位元的熵。縮短長度會以指數方式縮小空間:10 字元的 ID 具有 60 位元,對於許多內部用途而言已足夠,但對於高流量的資料集則需要進行衝突審查。本頁面並未承諾任何所選的長度都不會發生衝突,您也不應如此承諾。

請勿試圖從字元中推斷意義。Nano ID 並非循序編號、不編碼時間、區域、分片或建立順序,也無法被解碼為商業意義。如果下游系統需要詞典編纂式的時間排序、標準化的 UUID 表示法或離線解碼,請選擇為該目的而設計的格式,例如 ULID 或 UUIDv7。若想比較同樣的本機處理視角如何應用於不同的瀏覽器工具,關於 JSON 轉 CSV 安全性的隱私優先指南針對同類別中的轉換器,逐一說明了相同的檢查清單。

快速比較:安全與不安全的產生器行為

下表整理了將線上 Nano ID 產生器從安全推向不安全的各種行為。在評估任何類似工具時,可將其作為檢查清單使用,包括 Nano ID 產生器本身、替代的網頁應用程式,或是你正在為同事審閱的自製腳本。

行為安全不安全
隨機來源Web Crypto API 位元組Math.random、時間戳記、計數器
產生期間的網路流量無識別碼上傳到伺服器
符號對應依字母表大小進行拒絕取樣對自訂字母表使用天真的位元組取模
重複處理本地檢查加上資料庫唯一約束本地檢查取代資料庫約束
預期用途應用程式識別碼、URL 簡稱、分享權杖密碼、API 金鑰、加密金鑰、復原代碼

一旦工具無法通過前三項,「線上使用是否安全」的答案就是否,不論頁面看起來多麼精緻。一旦通過前三項,對於非機密識別碼的答案是肯定,但對於最底下一項則是明確否定。安全性是工具如何建構的特性,而非行銷文案所做出的承諾,而確認它的唯一可靠方法是閱讀實作而非首頁。

相關閱讀:公開的 NTP 伺服器清單在線上使用是否安全?。