Linux中的隨機數可以從兩個特殊的文件中產生,一個是/dev/urandom.另外一個是/dev/random。他們產生隨機數的原理是利用當前系統的熵池來計算出固定一定數量的隨機比特,然後將這些比特作為字節流返回。熵池就是當前系統的環境噪音,熵指的是一個系統的混亂程度,系統噪音可以通過很多參數來評估,如內存的使用,文件的使用量,不同類型的進程數量等等。如果當前環境噪音變化的不是很劇烈或者當前環境噪音很小,比如剛開機的時候,而當前需要大量的隨機比特,這時產生的隨機數的隨機效果就不是很好了。
這就是為什麼會有/dev/urandom和/dev/random這兩種不同的文件,後者在不能產生新的隨機數時會阻塞程序,而前者不會(ublock),當然產生的隨機數效果就不太好了,這對加密解密這樣的應用來說就不是一種很好的選擇。/dev/random會阻塞當前的程序,直到根據熵池產生新的隨機字節之後才返回,所以使用/dev/random比使用/dev/urandom產生大量隨機數的速度要慢。
下面是一個簡單的測試:
可以看到使用/dev/random產生隨機數的速度很慢,而且產生的量很有限,當然,/dev/urandom的隨機效果則好很多。