SheepDev

雜湊、ID與隨機數

批次準備測試 ID 與隨機字串

使用工具

測試列表介面時 1、2、3 可能夠用,但邀請連結的秘密部分不能照做。需要的是不重複、難以預測還是可重現,會決定產生方式。不要把所有隨機值視為同一種功能,應分開這三個目的。

產生三個 UUID,觀察格式

產生數量設為 3、版本 v4。每次結果不同,不應期待固定值。常見十六進位分組為 8-4-4-4-12,含連字號共 36 字元;第三組開頭 4 等位元是固定版本資訊,並非 128 位元全是隨機。

格式範例,不作秘密值
550e8400-e29b-41d4-a716-446655440000

將產生值輸入確認功能可檢查格式和版本,但格式正確不證明對應真實使用者或紀錄,工具不會查詢資料庫。格式驗證與權限測試應分開,長 ID 不能代替存取控制。

v7 包含時間資訊

v7 前部包含 Unix 毫秒,確認工具能讀取。結構便於按時間排序,但不證明操作在該時刻完成;裝置時鐘、產生方式及 ID 重用都會影響含義。稽核事件時間應另行記錄,不只從 ID 推測。

不能一概保證同毫秒多次產生或跨裝置的順序。應按識別和儲存需求選擇 v4、v7,公開 v7 也會公開含時間的結構。新版本不等於更適合所有秘密權杖情境。

隨機權杖先看原始位元組數

32 位元組以十六進位輸出為 64 字元,無填補 Base64url 為 43 字元。較短不代表隨機位元更少,而是表示效率不同。兩次產生會得到新位元組,不能期待兩條字串只是同一值的不同表示,應比較長度關係。

工具使用密碼學亂數,不會退回 Math.random,但不負責分發、儲存或撤銷。邀請和重設連結的期限、一次性使用、權限仍由應用程式設計;產生長隨機值不等於整套連結流程安全。

可重現測試的目標不同

每次不同的資料可能掩蓋介面或處理錯誤。需要重現時,可在假資料產生中固定欄位定義、數量和 Seed。這與不可預測秘密的目標相反,能由 Seed 重現的值不能拿來做密碼或認證權杖。

測試亂數產生器本身時,應檢查數量、格式、字元集、版本和位元組數,而不是固定字串。少量樣本沒有碰撞不能證明永遠不重複,儲存端仍需唯一限制與碰撞處理。

人工輸入還要考慮可讀性

人工輸入密碼時可排除 0/O、1/l 等易混字元,並檢查目標系統的長度與符號限制。要求多個字元種類時,長度也要容得下。最好在產生時指定條件,而不是事後添加可預測的固定模式。

最後明確用途:紀錄識別用 UUID,不可預測秘密用相應位元組數的隨機權杖,重現錯誤用帶 Seed 的虛構資料,都不必複製真實個人資訊。分享前區分普通識別與秘密,再決定剪貼簿和螢幕共用的處理。

ID 不同不代表測試狀態不同

一百個 UUID 只是不同識別碼,不是一百種有意義狀態。名稱、狀態和長度都一樣時,空名、長名、同時間、同名不同 ID 等仍未測試。需要重現時可主動固定生成結果為 Fixture,而非期待隨機產生器重現。

UUID 格式正確不證明紀錄存在,合法虛構 ID 可測不存在狀態。用短序號代替實際形狀可能漏掉換行和長度限制。按測試目的分別選擇格式、存在性、長度、可重現性,不要混淆識別碼與秘密權杖要求。

分發的 Fixture 不要混入正式使用者 ID 或真實權杖。格式版面測試通常虛構值足夠,複製時標註用途,避免後來誤當真實憑證。工具不自動保存,需主動保留重現所需內容。隨機生成、可重現資料、正式秘密是不同用途。

參考資料

使用工具

指南 →