何時使用 /dev/random 與 /dev/urandom
我應該使用
/dev/random
or/dev/urandom
嗎?在哪些情況下我會更喜歡其中一種?
TL; 博士
用於
/dev/urandom
大多數實際目的。更長的答案取決於您正在執行的 Unix 的風格。
Linux
從歷史上看,
/dev/random
是/dev/urandom
同時推出的。正如@DavidSchwartz在評論中指出的那樣,
/dev/urandom
在絕大多數情況下,使用是首選。他和其他人還提供了指向我推薦進一步閱讀的優秀神話文章的連結。/dev/urandom
總之:
- 手冊頁具有誤導性。
- 兩者都由相同的 CSPRNG饋送以生成隨機性(圖 2 和圖 3)
/dev/random
當熵用完時阻塞,因此讀取/dev/random
可以停止程序執行。- 熵的數量是保守估計的,但沒有計算在內
/dev/urandom
永遠不會阻塞。- 在極少數情況下,在啟動後不久,CSPRNG可能沒有足夠的熵來正確播種,並且
/dev/urandom
可能不會產生高質量的隨機性。- 如果 CSPRNG 最初是正確播種的,那麼熵低不是問題。
- CSPRNG 正在不斷地重新播種。
- 在 Linux 4.8 及更高版本中,
/dev/urandom
不會耗盡熵池(由 使用/dev/random
),而是使用上游的 CSPRNG 輸出。- 使用
/dev/urandom
.規則的例外
在 Cryptography Stack Exchange 的何時在 Linux中使用
/dev/random
時/dev/urandom
, @otus給出了兩個案例:
- 在低熵設備上啟動後不久,如果尚未生成足夠的熵來正確播種
/dev/urandom
。- 生成具有資訊論安全性的一次性便箋簿
如果您擔心 (1),您可以檢查 中可用的熵
/dev/random
。如果你正在做(2)你會知道的:)
注意:您可以檢查從 /dev/random 讀取是否會阻塞,但要注意可能的競爭條件。
替代方案:兩者都不使用!
@otus 還指出,
getrandom()
系統將讀取/dev/urandom
並僅在初始種子熵不可用時才會阻塞。改用存在問題
/dev/urandom``getrandom()
,但可以想像/dev/xrandom
基於它創建新設備getrandom()
。蘋果系統
沒關係,正如 維基百科所說:
macOS 使用基於 SHA1 的160 位Yarrow 。/dev/random 和 /dev/urandom 沒有區別;兩者的行為相同。Apple 的 iOS 也使用 Yarrow。
自由BSD
沒關係,正如維基百科所說:
/dev/urandom
只是一個連結,/dev/random
並且只會阻塞,直到正確播種。這意味著在啟動之後,FreeBSD 足夠聰明,可以等到收集到足夠多的種子熵後再提供永無止境的隨機良善流。
NetBSD
使用
/dev/urandom
,假設您的系統已至少讀取一次/dev/random
以確保正確的初始播種。
/dev/urandom
從不阻塞。
/dev/random
有時會阻塞。如果已知系統狀態是可預測的,則會在啟動時提前阻塞。應用程序應該
/dev/urandom
在需要隨機生成的數據時進行讀取,例如用於模擬的加密密鑰或種子。系統應設計為
/dev/random
在執行任何與 Internet 通信或需要加密的服務之前,在啟動時至少明智地讀取一次,以避免可預測地生成密鑰。