關於 PRNG 的一些注意事項
最近我讀到了偽隨機生成器,我有一些觀察:
- 我的結論是,當熵太少時,PRNG 的安全實現必須阻塞或返回錯誤程式碼。如果 PRNG 不這樣做,則意味著它不安全——我們無法確定返回的偽隨機位“來自”真正的隨機位(通過足夠的熵實現)。是的?
- OpenSSL 提供的理解和管理熵使用點 PRNG展示文稿不會自行重新播種(幻燈片 32)。這是否意味著在長時間執行的應用程序中我們必須手動重新設置種子?否則我們沒有安全的 PRNG?如果是,如何重新播種?每一分鐘?每隔一小時?每個生成 1024 個字節?當熵足夠時,如何確定種子被拿走了?
- 如果您知道涵蓋我的疑問的書籍/章節/部落格,請告訴我!
提前致謝 :)
解決您的一些問題:-
PRNG 的安全實現必須是阻塞的
CSPRNG 是 PRNG 的加密安全版本。給定一個好的和未知的(對於任何攻擊者)種子,那麼 CSPRNG 可以永遠有效地執行。ChaCha20 或基於 AES 的東西可以生成 oodlebytes 的輸出。
這是語義上的區別,但你可以說這樣的 CSPRNG 應該在初始化時阻塞。除非以足夠的熵正確播種,否則它們不應輸出任何內容。而且由於有時難以獲得未知熵,因此在 CSPRNG 開始之前可能會有延遲。對於某些實現(例如沒有板載 TRNG 的物聯網設備)而言,獲取 128 或 256 位未知熵可能會很長。
然而,重新播種可能很有用,尤其是在台式電腦/伺服器的情況下。此類設備允許其他程序與 CSPRNG 一起執行。目前有 263 個在我的
/dev/urandom
設備旁邊執行。他們中的任何一個人都可能在監視我。定期重播是為了減輕對 CSPRNG 內部狀態的潛在危害。如果 RNG 在您廚房的物聯網冰箱上執行,則不需要重新播種。…如何重新播種?每一分鐘?每隔一小時?
好吧,這就是訣竅。這將取決於您的環境。CSPRNG Fortuna使用了一種非常複雜的、可變的定時重新播種和池化機制。Quantis量子密鑰分發系統可能每隔幾分鐘就對傳統方進行重新加密。這個
/dev/urandom
答案給出了1 分鐘的預設重新播種率。我看不出為什麼物聯網酒櫃必須在電源循環之間重新播種。我認為沒有人可以給你一個有意義的補種期。一條建議可能是,如果您可以訪問某種形式的 TRNG,您不妨盡可能多地利用它。儘管考慮到在密碼學而不是模擬中,確切的隨機流通常與密鑰和/或 IV 密切相關。在協議建立後簡單地交換 CSPRNG 的內部狀態會突然中斷會話。該協議將不得不重新建立。這增加了複雜性和計算/網路成本,也適用於 OpenSSL。您的會話將終止。
至於進一步閱讀,當然是這個論壇。在熵和CSPRNG標籤下有很多爭論。