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


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 來產生隨機數,這樣才不會引起程序莫名的掛起。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM