/dev/random
實現
並不是所有作業系統中的/dev/random的實現都是相同的。以下列舉了一些作業系統中的實現。
Linux
Linux內核中的是第一個以背景噪聲產生真正的亂數產生的實現,它允許程式訪問來自裝置驅動程式或其它來源的背景噪聲。
1994年,美國程式設計師曹子德(Theodore Y. Ts'o)第一次在Linux內核中實現了亂數發生器[1][2]。使用了SHA-1雜湊演算法而非密碼,以避開法律限制。另一個原因是任意給定的雜湊或密碼加密強度弱,而新亂數發生器在提高了密碼強度。
發生器有一個容納噪聲數據的熵池,在讀取時,/dev/random
裝置會返回小於熵池噪聲總數的隨機位元組。/dev/random
可生成高隨機性的公鑰或一次性密碼本。若熵池空了,對/dev/random
的讀操作將會被阻塞,直到收集到了足夠的環境噪聲為止[3]。這樣的設計使得/dev/random
是真正的亂數發生器,提供了最大可能的亂數據熵,建議在需要生成高強度的金鑰時使用。
/dev/random
的一個副本是/dev/urandom
(「unblocked」,非阻塞的亂數發生器[4]),它會重複使用熵池中的數據以產生偽亂數據。這表示對/dev/urandom
的讀取操作不會產生阻塞,但其輸出的熵可能小於/dev/random
的。它可以作為生成較低強度密碼的偽亂數生成器,不建議用於生成高強度長期密碼。
/dev/random
也允許寫入,任何用戶都可以向熵池中加入亂數據。即使寫入非亂數據亦是無害的,因為只有管理員可以呼叫ioctl以增加熵池大小。Linux內核中當前熵的值和大小可以通過訪問/proc/sys/kernel/random/
資料夾中的檔案得到。
2006年3月,Gutterman、Pinkas和Reinman發表了對Linux亂數發生器的詳細密碼學分析[5],其中提出了該發生器的幾個弱點。也許其中最嚴重的問題發生在嵌入式系統和Live CD系統,類似路由器和無盤工作站中的應用。在這些系統中,引導狀態是可預測的,且環境熵的來源也較為受限。對於有NVRAM的系統,他們建議在關機時儲存一部分亂數發生器的狀態,使得在下次開機時可以恢復這些狀態。對於路由器而言,網絡數據是熵的主要來源,他們認為在重新啟動前後儲存和恢復數據可能要求潛在的攻擊者要麼竊聽從路由器投入使用開始全部的網絡資訊,或直接取得路由器的內部狀態。他們寫道,這個問題對於無線路由器而言尤其關鍵,因為其網絡資訊可以遠端取得到,並可能用於產生數據加密用金鑰的隨機發生器。
FreeBSD
FreeBSD作業系統實現了256位的Yarrow演算法變體,以提供偽亂數流。與Linux的/dev/random
不同,FreeBSD的/dev/random
不會產生阻塞,與Linux的/dev/urandom
相似,提供了密碼學安全的偽亂數發生器,而不是基於熵池。而FreeBSD的/dev/urandom
則只是簡單的連結到了/dev/random
。
Yarrow演算法的前提是現代的偽亂數發生器的安全性很高,若其內部狀態不為攻擊者所知,且比熵估計更易理解。在某些情況下,攻擊者可以在某種程度上掌握熵的量,例如無盤伺服器的熵幾乎全部來自於網絡,使得它可能易受中間人攻擊的影響。演算法的種子會被規則的重設:在網絡和磁碟負載較輕的系統上,一秒內種子可能被重設數次。
FreeBSD也支援硬件亂數發生器,並在安裝了類似硬件時會替代Yarrow演算法。
2004年,Landon Curt Noll測試了FreeBSD 5.2.1版本的/dev/random
,發現它不是一個密碼學強的亂數發生器,因為其輸出在十億位測試中顯示出了多個一致性缺陷。類似的缺陷亦發生在Linux 2.4.21-20,Solaris 8 patch 108528-18和Mac OS X 10.3.5的/dev/random
中[6]。
其它作業系統
/dev/random
和/dev/urandom
也存在於
Solaris[7]、Mac OS X[8]、NetBSD[9]、OpenBSD[10]、Tru 64 UNIX 5.1B[11]、AIX 5.2[12]和HP-UX 11i v2[13]中。與FreeBSD的實現類似,AIX採用了它自身的基於Yarrow的設計,但AIX使用的熵源數量低於標準/dev/random
的實現,並且在系統認為熵池的熵達到足夠值時停止填充熵池[14]。
在Windows NT中,ksecdd.sys
提供了類似的功能,但讀取特殊檔案\Device\KsecDD
並不會提供與UNIX中相同的功能。開發文件中提到的,用於產生密碼用亂數據的函數是CryptGenRandom和RtlGenRandom[15][16]。
雖然DOS沒有原生的提供類似功能,但有開源的Noise.sys(頁面存檔備份,存於互聯網檔案館)提供了類似功能。該實現與/dev/random
的功能和介面類似,即建立了兩個裝置,RANDOM$與URANDOM$,也可以通過/DEV/RANDOM$和/DEV/URANDOM$訪問。
EGD
EGD(熵收集守護行程,Entropy Gathering Daemon)通常可以在不支援/dev/random
裝置的UNIX系統中提供類似的功能。這是一個執行於用戶態的守護行程,提供了高質素的密碼用亂數據。一些加密軟件,例如OpenSSL,GNU Privacy Guard和Apache HTTP伺服器支援在/dev/random
不可用的時候使用EGD。
EGD(頁面存檔備份,存於互聯網檔案館),或者類似的軟件,例如prngd(頁面存檔備份,存於互聯網檔案館),可以從多種來源收集偽隨機的熵,並對這些數據進行處理以去除偏置,並改善密碼學質素,然後允許其它程式通過UNIX域套介面(通常使用/dev/egd-pool
),或TCP套介面訪問其輸出。該程式通常使用建立子行程的以查詢系統狀態的方式來收集熵。它查詢的狀態通常是易變的、不可預測的,例如CPU、I/O、網絡的使用率,也可能是一些紀錄檔檔案和臨時目錄中的內容。
參考文獻
- ^ Jack Lloyd. On Syllable's /dev/random. December 9, 2008 [2009-04-27]. (原始內容存檔於2009-04-29).
- ^ /dev/random. everything2.com. June 8, 2003 [2009-04-27]. (原始內容存檔於2009-04-29).
- ^
Linux用户手册:urandom (4)
- ^ random(4) - Linux manual page. [2010-10-09]. (原始內容存檔於2010-04-30).
- ^ Zvi Gutterman; Benny Pinkas, Tzachy Reinman. Analysis of the Linux Random Number Generator (PDF). March 6, 2006 [2008-09-18]. (原始內容存檔 (PDF)於2008-10-03).
- ^ BIllion Bit Test: Results and Conclusions, LavaRnd (LavaRnd), 22 Sep 2004 [3 July 2009], (原始內容存檔於2007-04-03)
- ^ 存档副本. [2010-10-09]. (原始內容存檔於2009-07-31).
- ^ Documentation Archive. [2010-10-09]. (原始內容存檔於2010-02-22).
- ^ rnd - NetBSD Manual Pages. [2010-10-09]. (原始內容存檔於2016-03-04).
- ^ random(4) - OpenBSD manual pages. man.openbsd.org. [2021-03-21]. (原始內容存檔於2021-05-14).
- ^ 存档副本. [2010-10-09]. (原始內容存檔於2011-06-07).
- ^ IBM Knowledge Center. [2010-10-09]. (原始內容存檔於2013-07-01).
- ^ Software solutions | HP® Official Site. [2010-10-09]. (原始內容存檔於2008-12-24).
- ^ Iain Roberts. AIX 5.2 /dev/random and /dev/urandom devices. Lists.gnupg.org. April 25, 2003 [2008-09-18]. (原始內容存檔於2012-02-22).
- ^ CryptGenRandom. [2010-10-09]. (原始內容存檔於2008-04-23).
- ^ RtlGenRandom. [2010-10-09]. (原始內容存檔於2008-10-14).