繁體中文

開發者工具 · UUID 產生器

基於名稱的 UUID(v3 和 v5):來自命名空間的確定性 ID

· 背景

uuid 密碼學 瀏覽器 API

命名空間和名稱連接,使用 SHA-1 進行雜湊處理,並將結果位元組格式化為 UUIDv5
原始 ToolAcre 向量圖

當相同的外部記錄必須始終獲得相同的識別碼時,隨機 UUID 將無法運作。版本 3 和 5 UUID 將命名空間和名稱雜湊為穩定 ID;這篇文章解釋瞭如何以及何時使用它們。

重新導入同一位客戶兩次-確定性 ID 解決的重複問題

資料導入管道從外部系統接收客戶記錄,外部 ID 在該系統內穩定。如果您為每次匯入執行產生新的隨機 UUID,則匯入相同客戶兩次會產生兩個不同的識別碼和重複記錄。這種重複流入下游的報告、計費和支持系統。如果您從客戶的外部 ID 和代表匯入來源的穩定命名空間派生 UUID,則每次匯入都會為相同客戶產生相同的 UUID,讓您能夠識別和更新現有記錄。這種確定性是 v3 和 v5 UUID 的定義特徵:它們不是獨立產生的,而是從輸入派生的,並相同的輸入始終產生相同的 UUID。

命名空間加名稱-如何連接和雜湊輸入,以及為什麼命名空間可以防止不同來源之間的衝突

v3 或 v5 UUID 源自三個元件:命名空間 UUID(通常是預先定義的)、名稱(任何位元組字串)和雜湊演演算法(v3 為 MD5,v5 為 SHA-1)。將命名空間 UUID 的 16 個位元組與名稱的 UTF-8 位元組連接起來,對連接進行雜湊處理,取得雜湊輸出的前 16 個位元組,並將這些位元組解釋為版本半位元組設定為 3 或 5 的 UUID。命名空間對 ID 空間進行分割:來自 DNS 命名空間的 v5 UUID 永遠不會與來自 URL 命名空間的 v5 UUID 發生衝突。 RFC 9562 定義了四個預設名稱空間:按 DNS 名稱、按 URL、按 OID 和按 X.500 可分辨名稱。組織可以透過產生 v4 UUID 來建立自己的命名空間。

v3 中的 MD5 和 v5 中的 SHA-1 — 為什麼這裡可以接受弱化哈希,因為 ID 不是安全控制

版本 3 使用 MD5,版本 5 使用 SHA-1,選擇可追溯至其規格日期和可用實作。對於基於名稱的 UUID,這種區別並不重要,因為雜湊函數不是安全邊界或加密控制。 UUID 不證明真實性或完整性;它只是將可變長度字串轉換為固定的 128 位元值。攻擊模型是無關緊要的,因為 UUID 是作為不透明值儲存和比較的,而不是作為證據或安全控制。新的實作應該使用 v5 (SHA-1) 而不是 v3 (MD5),不是出於令人信服的安全原因,而是因為 v5 是現代標準並廣泛可用。

預先定義的命名空間 — DNS、URL、OID 和 X.500,以及何時建立自己的命名空間

RFC 9562 指定了四個具有特定位元組表示形式的預定義命名空間 UUID:6ba7b810-9dad-11d1-80b4-00c04fd430c8(用於 DNS)、6ba7b811-9dad-11d1-80b4-00c4fd 6ba7b812-9dad-11d1-80b4-00c04fd430c8 用於 OID,6ba7b814-9dad-11d1-80b4-00c04fd430c8 用於 X.500 可分辨名稱。從 DNS 命名空間派生的 v5 UUID 和名稱 www.example.com 將始終相同,並絕不會與來自 URL 命名空間的 v5 UUID 衝突。使用預先定義的命名空間可確保互通性:如果多個團隊獨立使用 v5 和 DNS 命名空間,他們會為相同的 DNS 名稱產生相同的 UUID。選擇或建立命名空間是模式設計的一部分。

工作範例 — 從概念上逐步從 URL 命名空間和記錄 URL 衍生出 v5 UUID

從概念上從 URL 命名空間和名稱 https://example.com/api/users/42 派生 v5 UUID。 16 位元組的命名空間 UUID 為 6b a7 b8 11 9d ad 11 d1 80 b4 00 c0 4f d4 30 c8。名稱是 UTF-8 字串 https://example.com/api/users/42,即 30 個位元組。連接命名空間位元組 (16) 和名稱位元組 (30) 以獲得總共 46 個位元組。計算 SHA-1 雜湊值,產生 20 位元組雜湊值。取得前 16 個位元組並將其解釋為 UUID,其中版本半位元組設定為 5,變數位元設定為 RFC 標準。使用相同的輸入再次計算會產生相同的結果。大多數開發人員使用他們的語言 UUID 函式庫來計算 v5。

模式被打破的地方 - 當名稱更改時、當團隊之間的命名空間不一致時以及當輸入保密時

基於名稱的 UUID 假定名稱在系統和導入運作中穩定且一致。如果同一個外部記錄在不同的系統中具有不同的名稱,則從每個名稱產生 v5 會產生不同的 UUID,並無法識別同一個人。如果團隊之間未就命名空間達成一致(每個團隊為實際上相同的來源建立自己的命名空間),他們會產生不同的 UUID 並無法匹配記錄。如果輸入是敏感資料,則產生 v5 UUID 意味著 UUID 是一個公共的確定性值,任何人只要知道輸入就可以找到。當輸入變更或命名空間定義不一致時,確定性就會失效。

這不包括 - ToolAcre 產生器從 CSPRNG 中提取,因此基於名稱的 ID 需要您語言的 UUID 庫

ToolAcre 僅產生 v4 UUID,從瀏覽器加密安全產生器中提取以實現獨立。基於名稱的 UUID 派生需要您的語言 UUID 函式庫或計算 SHA-1 並正確格式化結果的實作。這篇文章解釋了概念和用例;在任何可以存取標準加密庫的語言中,實作 v5 產生都是簡單的。 v5 的推導機制很簡單;挑戰是將其整合到一個系統架構中,其中命名空間穩定,名稱一致,並該方法為您的團隊提供了詳細的文件記錄。開發團隊應該記錄命名空間的選擇。

重點:需要時確定,否則隨機 - 使用 v5 進行穩定映射,使用 ToolAcre 產生器處理所有不可猜測的內容

使用 v5 在外部識別碼和內部記錄之間建立穩定的對應。確定性可防止重複導入,並使跨系統的匹配記錄變得簡單可靠。不要將基於名稱的 UUID 用於需要不可猜測的識別碼或需要強保密性和秘密的場景。 ToolAcre 為識別碼產生隨機 v4 UUID,這些識別碼必須獨立且獨特,不可預測。當您的系統需要將輸入對應到固定標識符的確定性 ID 時,您的語言 UUID 庫可以計算它們。當您控制輸入時,確定性是一個強大的功能。