Random-Number-Generator

為 PBKDF2 生成鹽的高效隨機數生成器

  • July 22, 2021

我一直在尋找一種生成隨機數的算法,並且該算法必須是安全的。

我將使用此算法生成將在 PBKDF2 中使用的鹽。

通過閱讀,我發現 ISAAC 是一種快速算法,比 RC4 更好,但在安全性方面並不好。另外,我也想過 Blum-Blum-Shub 算法,但是有些文章說效率不高。

哪種算法對於 PBKDF2 鹽生成既安全又合理有效?

由於目標是為 PBKDF2 生成鹽,因此不需要高效(如快速)隨機生成器:PBKDF2(故意)是計算密集型的。此外,在PBKDF2的許多用途中(例如儲存密碼),salt生成一次,儲存和重複使用多次,進一步降低了對salt生成效率的關注。俗話說:過早優化是萬惡之源

在這種用法中,您也不需要精確均勻的分佈(例如在賭場機器中使用的隨機發生器就是這種情況)。在鹽生成的背景下,RC4 的(非常輕微的)偏差不是問題。

在這種情況下,到目前為止,最重要的標準是生成器生成兩倍相同值的機率應該很低。正如最近關於 RSA 密鑰生成的軼事所示(此處也已更新),這很難正確實施,尤其是在網路設備上。基本問題是,如果輸入相同的輸入,任何確定性 RNG(例如 RC4 或 ISAAC)的不同執行都會產生相同的結果。因此,重要的是生成器的種子材料,以及它的狀態是否/如何在執行過程中保持不變。

不重複的生成器的兩個簡單實現是

  1. 增加一個持久整數(例如儲存在數據庫中),然後輸出它。整數應該足夠寬以至於永遠不會溢出,或者執行次數受到限制。
  2. 獲取某個粒度的UTC時間,至少等待那個粒度,加上時間源不確定性的最大絕對值的兩倍,再加一秒(考慮閏秒),然後輸出結果。

請注意,這兩種方法都假定單個實例執行,並且如果攻擊者可以影響系統(重置持久整數,更改時鐘設置……),則可能會被破壞。當然,這些生成器是可預測的,而不是隨機生成器。但是假設有一個隨機種子密鑰的可用性*,*這很容易解決:給定一個不重複的生成器的輸出 N,輸出 HMAC(Key,N)。

優秀軟體 RNG 的實際設計結合了使用多種技術收集的種子材料,包括上述技術、自啟動以來的 CPU 時鐘、處理時間、啟動時的 RAM 內容、硬碟和網路延遲、滑鼠位置、鍵盤按下及其時間、硬體序列號等比如硬碟和網卡…

有關軟體 RNG 的理想屬性和設計的更深入討論,請參閱yarrow。有關物理設計和測試,請參閱例如Design of Testable Random Bit Generators

如果您正在為 PBKDF2 生成鹽,那麼您真的不關心效率(因為 PKBKD2 的評估本身在設計上非常昂貴)。

此外,密碼鹽沒有很高的安全要求。我們真的不在乎是否有人能夠將有效的鹽值與隨機值區分開來。我們真正關心的是兩個人不太可能得到相同的鹽,並且提前預測鹽值是不平凡的。RC4 和 ISAAC 都滿足這些要求。

另一方面,如果您要為任何與安全相關的東西生成隨機數,我個人建議您查看NIST SP 800-90中的隨機數生成器(Dual_EC_DRBG 除外);它們是由知道自己在做什麼的人設計的,它們可以快速滿足您的需求。您唯一需要擔心的是熵收集(對於任何隨機數生成器,您都必須擔心這一點)。是的,它們對於你需要的東西來說太過分了。然而,矯枉過正並不一定是壞事。

引用自:https://crypto.stackexchange.com/questions/1925