linux中提供了 /dev/urandom 和 /dev/random 兩個特殊設備來提供隨機數。那么這兩個文件有什么區別呢?
要回答這個問題,先需要了解熵這個概念。
熵
linux是根據系統的熵池來產生隨機數的。熵池就是系統當前的環境噪音,環境噪音的來源很多,鍵盤的輸入、鼠標的移動、內存的使用、文件的使用量、進程數量等等。
當系統的熵不夠大的時候,則系統產生的隨機數隨機效果就不是很好,也就是說更容易被人猜測出來。
如何查看系統中的熵
通過下面命令可以查看系統熵池的容量: cat /proc/sys/kernel/random/poolsize
結果為:
4096
通過下面命令可以查看系統熵池中擁有的熵數: 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 havegedsystemctl start haveged
/dev/random 與 /dev/urandom 的區別
/dev/random 是真隨機數生成器,它會消耗熵值來產生隨機數,同時在熵耗盡的情況下會阻塞,直到有新的熵生成.
/dev/urandom 是偽隨機數生成器,它根據一個初始的隨機種子(這個種子來源就是熵池中的熵)來產生一系列的偽隨機數,而並不會在熵耗盡的情況下阻塞。
但是 若在系統啟動階段使用 =/dev/urandom= 則可能存在熵池中還不存在任何熵的情況,這時用 =/dev/urandom= 產生的隨機數是可預測的!
結合兩者的特點,可以看出,除非要在啟動啟動階段產生隨機數,否則絕大多數情況下還是使用 /dev/urandom 來產生隨機數,這樣才不會引起程序莫名的掛起。