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 是真隨機數生成器,它會消耗熵值來產生隨機數,同時在熵耗盡的狀況下會阻塞,直到有新的熵生成.
注:網上有關於random具備更好的隨機性的說法,這一點存在疑問,請閱讀How To Safely Generate A Random Number 和 Myths about /dev/urandom 這兩篇文章。
而 /dev/urandom 是僞隨機數生成器,它根據一個初始的隨機種子(這個種子來源就是熵池中的熵)來產生一系列的僞隨機數,而並不會在熵耗盡的狀況下阻塞。
可是 若在系統啓動階段使用 =/dev/urandom= 則可能存在熵池中還不存在任何熵的狀況,這時用 =/dev/urandom= 產生的隨機數是可預測的!
結合這者的特色,能夠看出,除非要在啓動啓動階段產生隨機數,不然絕大多數狀況下仍是使用 /dev/urandom 來產生隨機數,這樣纔不會引發程序莫名的掛起。