為 /dev/random 提供磁碟讀取等

為 /dev/random 提供磁碟讀取等

有沒有辦法提供/dev/random足夠的熵?數據不必是真正隨機的,即我可以附加一天中的時間和 pid 並向其添加 27,這並不重要,我只是想讓它運行得更快。

我試圖讓球滾動起來dd if=/dev/zero of=/dev/null。我想知道是否有某種方法可以用來add_keystroke_randomness人工/linux/random.h餵養,/dev/random這樣我就不會收到那些不可預測的阻塞呼叫。即我願意犧牲一些隨機性來換取速度。

PS - 請不要建議使用/dev/urandom

答案1

產生熵有多種解決方案。例如haveged(我對自己非常滿意)、、timer_entropyd等等audio-entropyd/dev/random如果您想全力以赴,也有硬體隨機產生器(以 USB 棒形式提供)。儘管它們產生的熵可能比你想像的要少......

儘管如此,/dev/urandom當您需要立即提供數據時,這始終是一個不錯的選擇。

對於大量資料(例如覆蓋硬碟),無論可用的熵如何,隨機設備在速度方面都不適合;像這樣基於 PRNG 的解決方案確實shred可以更好/更快地完成它。

答案2

(我的答案適用於 Linux。一般原則適用於其他 UNIX 變體,但不適用於random/urandom區別。)

這已經在核心內部發生了。

注入額外的熵總是沒有壞處的。如果你有一堆偽隨機字節,只要將它們寫入/dev/random,它們就會混合到熵池中。

哈韋格是一個收集額外熵的流行程式。

dd if=/dev/zero of=/dev/null不會造成任何硬體 I/O,因此不會增加任何熵。擊鍵包含少量的熵。


請注意,如果您在 Linux 下閱讀/dev/random,那麼您就做錯了。 Linux 設計者搞錯了:他們宣稱熵是一種很快就會耗盡的東西,這事實並非如此。解決“阻塞”的辦法/dev/random不是“注入更多的熵”,而是“使用適當的設備”。不管你想不想聽,你應該閱讀/dev/urandom

答案3

根據內核版本,Linux 將add_disk_randomness()add_input_randomness()、 和add_interrupt_randomness()作為熵源實現。這些事件對應於磁碟 I/O 事件、鍵盤和滑鼠事件以及中斷 (IRQ) 事件。確切的實作請參閱 random.c。這些來源在內部進行調節、混合和存儲,並用於為阻塞/dev/random和非阻塞/dev/urandom驅動程式提供資料。在這種情況下,非阻塞意味著/dev/urandom即使熵池不包含熵,呼叫也始終會產生輸出。儘管不太可能,但/dev/urandom使用可以導致低熵種子和可預測的確定性 RNG。這反過來又可能導致加密被破壞,RSA 特別容易受到低熵條件的影響。所以你不應該用於/dev/urandom加密。然而,啟動時間/dev/urandom熵在無頭系統上始終存在問題,並且需要額外的熵源才能正確運作。

解決啟動熵不足最簡單的方法是啟用RdRand(或RdSeed)via hw_rand,但這需要信任 Intel(現在是 AMD)黑盒子實作。如果您碰巧使用 QorlQ,則有等效的 SEC 功能。

或者,您可以實現軟體真(?)隨機數產生器。我的建議是CPU時間抖動由 Stephan Muller 設計,因為它是一個記錄良好的設計,並且易於與現有系統整合。請記住,它必須在沒有最佳化的情況下進行編譯以獲得最大熵結果。

相關內容