
有沒有辦法提供/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 設計,因為它是一個記錄良好的設計,並且易於與現有系統整合。請記住,它必須在沒有最佳化的情況下進行編譯以獲得最大熵結果。