linux系統隨機數原理,內核熵(entropy)值

Linux內核採用熵來描述數據的隨機性。熵(entropy)是描述系統混亂無序程度的物理量,一個系統的熵越大則說明該系統的有序性越差,即不肯定性越大。在信息學中,熵被用來表徵一個符號或系統的不肯定性,熵越大,代表系統所含有用信息量越少,不肯定度越大。
計算機自己是可預測的系統,所以,用計算機算法不可能產生真正的隨機數。可是機器的環境中充滿了各類各樣的噪聲,如硬件設備發生中斷的時間,用戶點擊鼠標的時間間隔等是徹底隨機的,事先沒法預測。Linux內核實現的隨機數產生器正是利用系統中的這些隨機噪聲來產生高質量隨機數序列。

內核維護了一個熵池用來收集來自設備驅動程序和其它來源的環境噪音。理論上,熵池中的數據是徹底隨機的,能夠實現產生真隨機數序列。爲跟蹤熵池中數據的隨機性,內核在將數據加入池的時候將估算數據的隨機性,這個過程稱做熵估算。熵估算值描述池中包含的隨機數位數,其值越大表示池中數據的隨機性越好。 算法

內核提供了兩個字符設備: /dev/random和/dev/urandom,其read函數(random_read()和urandom_read())用於向用戶模式程序輸出隨機數序列。上層應用程序能夠經過read系統調用從它們獲取隨機數序列。相對於/dev/urandom接口,/dev/random輸出的隨機數序列質量更高,適合於高強度的加密算法。/dev/urandom老是返回所請求的隨機數序列,不管熵池的熵估算值是否爲零;而/dev/random則只返回熵估算值所容許的最長的隨機數序列,當熵估算值爲零時,請求將被阻塞直到熵估算值增大到必定域值。
上述輸出接口最終均是經過調用 extract_entropy()函數輸出隨機數序列。Extract_entropy()函數使用SHA或MD5算法散列(Hash)熵池,將散列後的結果做爲隨機數序列輸出給用戶使用,這樣避免了直接訪問熵池中的內容。因爲從SHA或MD5算法散列的結果反推原始數據的可能性幾乎爲零,因此這種設計極大的提升了安全性。攻擊者沒法直接訪問熵池,也沒法根據過去的隨機數序列預測未來的序列。
當系統啓動的時候,因爲啓動過程是個肯定的可預測的過程,這種狀況下,熵池的熵值將很是小,致使產生的隨機數序列質量降低,從而給攻擊者破解的可能。爲了克服系統啓動過程的可預測性帶來的影響,Linux操做系統在系統關機的時候保存當前熵池的內容,當系統下次啓動的時候恢復上次關機時熵池的數據,這樣就有效增長了熵池的熵估算值,避免了隨機數序列質量的降低。
安全

相關文章
相關標籤/搜索