2010-09-11 69 views
56

我一直在閱讀有關/dev/urandom,據我所知,/dev/random通過利用網絡數據包計時等幾個事件來創建加密隨機數。但是,我是否明白/dev/urandom使用PRNG,使用PRNG號碼從/dev/random?或者只要有零星 - 只要使用/dev/random - 當它們耗盡時,它會回落到一些PRNG上,種子從哪裏收集?我瞭解/ dev/urandom嗎?

回答

76

urandom手冊頁:

隨機數發生器收集來自設備驅動程序 和其他來源 環境噪聲成 熵池。發生器還保持熵池中噪聲位數的估計值 。 從這個熵池中創建隨機數 。

讀取時,/ dev /隨機設備 將只返回熵池中噪聲 的估計位數 內的隨機字節。/dev/random 應該適合用於需要 等非常高質量的隨機性,例如 作爲一次性鍵盤或鍵 一代。 當熵池 爲空時,從/ dev/random中讀取數據塊 數據塊,直到收集到其他環境 噪聲。

從/ dev/urandom設備讀取不會阻止等待更多 熵。因此,如果在熵池 池中存在不足的熵,則返回的值爲 理論上容易受到驅動程序使用的算法 的密碼攻擊。關於 如何做到這一點的知識在 當前未分類文獻中不可用,但 在理論上可能存在此類 攻擊。如果這是您應用程序中的 問題,請改爲使用 /dev/random。

都使用PRNG,雖然使用環境數據和熵池使得破解PRNG的天文數字難度更大,如果不收集完全相同的環境數據,也是不可能的。作爲一個經驗法則,沒有從量子事件中收集數據的專門昂貴的硬件,沒有真正的隨機數發生器(即產生真正不可預測的數字的RNG);儘管爲了加密的目的,/ dev/random或/ dev/urandom就足夠了(所使用的方法是用於CPRNG,密碼僞隨機數發生器)。

熵池和阻塞/ dev/random的讀取被用作安全防護以確保不可能預測隨機數;例如,如果攻擊者用盡了系統的熵池,儘管對於今天的技術來說可能性不大,但他可以預測長時間沒有被重新調用的/ dev/urandom的輸出(儘管這也需要攻擊者用盡系統收集更多熵的能力,這也是天文數字不可思議的)。

+0

我也是我的一個疑問..nice信息。謝謝。 – jyz 2010-09-11 14:29:16

+1

@Lie,那麼OS在哪裏存儲'/ dev/random'位?它們存儲的位數有限制嗎? – Pacerier 2014-12-12 10:05:27

+0

@Pacerier,random.c手冊頁和相應的源代碼很好地評論和相當有趣:http://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/drivers/char/random 。c – ijustlovemath 2016-09-22 00:51:51

30

實際上你在實際中需要的是FreeBSD的/dev/urandom提供的內容:它將從/dev/random讀取足夠長度的初始種子,然後使用PRNG。因此,它最初可能會阻塞(僅在系統啓動後),但一旦收集到足夠的熵,它就不會阻塞。這提供了大多數加密協議所需的隨機性級別,而不是過度阻塞。

Linux的/dev/urandom是類似的,但它永遠不會阻塞,因此如果在啓動後立即使用,則可能會返回低質量的隨機性。另一方面,/dev/random可能在啓動時間後甚至會阻塞,這也是一個問題。我經常看到服務器神祕地失速,因爲一些軟件堅持使用/dev/random,而無鍵盤服務器沒有得到足夠的熵。

通常的Linux發行版在關機時保存從/dev/urandom獲得的隨機種子,並在下一次啓動時將其注入,從而保證/dev/urandom提供的隨機的質量。只有在操作系統安裝過程中,密碼質量纔會成爲問題,通常不是因爲安裝涉及與執行安裝的人進行多次交互,從而產生大量的熵。總之,在Linux和FreeBSD下,你應該使用/dev/urandom,而不是/dev/random

+0

考慮到/ dev/random被認爲不如/ dev/urandom安全,因爲最初的種子依賴於/ dev/random,因此不能建議這是一種不太安全的方法嗎? – monokrome 2013-12-19 19:17:35

+2

no/dev/urandom比/ dev/urandom不安全,因爲/ dev/urandom在熵不在時不會阻塞 – Demi 2014-02-22 15:52:16

+7

@Demetri - 您剛纔說過/ dev/urandom不如其自身安全。 – 2014-06-17 03:14:25

7

報價here

/dev/random熵池耗盡後,將阻止。它將保持阻塞狀態,直到從可用的熵源收集到額外的數據。這可能會減慢隨機數據的產生。

/dev/urandom不會阻塞。相反,它會重用內部池來產生更多的僞隨機比特。

  • 你只是想對某種測試的隨機數據大文件:


/dev/urandom時,最好使用。

  • 您正在使用dd命令通過將數據替換爲隨機數據來擦除磁盤上的數據。
  • 幾乎在其他地方,你沒有一個很好的理由使用/dev/random來代替。
  • /dev/random很可能是更好的選擇時:

    • 隨機性是加密的應用程序中的安全至關重要 - 一次性墊,密鑰生成。