/dev/urandom和/dev/random的區別是什麼

linux中提供了 /dev/urandom 和 /dev/random 兩個特殊設備來提供隨機數。那麼這兩個文件有什麼區別呢?linux

要回答這個問題,先須要瞭解熵這個概念。
dom

linux是根據系統的熵池來產生隨機數的。熵池就是系統當前的環境噪音,環境噪音的來源不少,鍵盤的輸入、鼠標的移動、內存的使用、文件的使用量、進程數量等等。ide

當系統的熵不夠大的時候,則系統產生的隨機數隨機效果就不是很好,也就是說更容易被人猜想出來。加密

如何查看系統中的熵

經過下面命令能夠查看系統熵池的容量:進程

cat /proc/sys/kernel/random/poolsize內存

結果爲:it

4096class

經過下面命令能夠查看系統熵池中擁有的熵數:隨機數

cat /proc/sys/kernel/random/entropy_avail 程序

結果爲:

3793

經過下面命令能夠查看從熵池中讀取熵的閥值,當 entropy_avail 中的值少於這個閥值,這讀取 /dev/random 會被阻塞:

cat /proc/sys/kernel/random/read_wakeup_threshold

結果爲:

64

如何快速生成熵

經過開啓 haveged 服務能夠快速產生熵。若 entropy_avail 的值小於1000,則建議安裝 haveged,不然加密程序會阻塞直到系統有足夠的熵後才繼續運行。

pacman -S haveged --noconfirm

而後開啓 haveged 服務

systemctl enable haveged
systemctl start haveged

/dev/random 與 /dev/urandom 的區別

/dev/random 是真隨機數生成器,它會消耗熵值來產生隨機數,同時在熵耗盡的狀況下會阻塞,直到有新的熵生成.

注:網上有關於random具備更好的隨機性的說法,這一點存在疑問,請閱讀How To Safely Generate A Random Number 和 Myths about /dev/urandom 這兩篇文章。

而 /dev/urandom 是僞隨機數生成器,它根據一個初始的隨機種子(這個種子來源就是熵池中的熵)來產生一系列的僞隨機數,而並不會在熵耗盡的狀況下阻塞。

可是 若在系統啓動階段使用 =/dev/urandom= 則可能存在熵池中還不存在任何熵的狀況,這時用 =/dev/urandom= 產生的隨機數是可預測的!

結合這者的特色,能夠看出,除非要在啓動啓動階段產生隨機數,不然絕大多數狀況下仍是使用 /dev/urandom 來產生隨機數,這樣纔不會引發程序莫名的掛起。

相關文章
相關標籤/搜索