/dev/random
/dev/random在類UNIX系統中是一個特殊的設備文件,可以用作隨機數發生器或偽隨機數發生器。
實現
[編輯]並不是所有操作系統中的/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).