Devices

何時使用 /dev/random 與 /dev/urandom

  • February 19, 2021

我應該使用/dev/randomor/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給出了兩個案例

  1. 在低熵設備上啟動後不久,如果尚未生成足夠的熵來正確播種/dev/urandom
  2. 生成具有資訊論安全性的一次性便箋簿

如果您擔心 (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以確保正確的初始播種。

rnd(4) 聯機幫助頁說:

/dev/urandom從不阻塞。

/dev/random有時會阻塞。如果已知系統狀態是可預測的,則會在啟動時提前阻塞。

應用程序應該/dev/urandom在需要隨機生成的數據時進行讀取,例如用於模擬的加密密鑰或種子。

系統應設計為 /dev/random在執行任何與 Internet 通信或需要加密的服務之前,在啟動時至少明智地讀取一次,以避免可預測地生成密鑰。

引用自:https://unix.stackexchange.com/questions/324209