作者 | James J
譯者 | geekpi ? ? 共計翻譯:727 篇 貢獻時間:1679 天
熵
當談到 /dev/random
和 /dev/urandom
的主題時,你總是會聽到這個詞:“熵”。每個人對此似乎都有自己的比喻。那為我呢?我喜歡將熵視為“隨機果汁”。它是果汁,隨機數需要它變得更隨機。
如果你曾經生成過 SSL 證書或 GPG 金鑰,那麼可能已經看到過像下麵這樣的內容:
We need to generate a lot of random bytes. It is a good idea to perform
some other action (type on the keyboard, move the mouse, utilize the
disks) during the prime generation; this gives the random number
generator a better chance to gain enough entropy.
++++++++++..+++++.+++++++++++++++.++++++++++...+++++++++++++++...++++++
+++++++++++++++++++++++++++++.+++++..+++++.+++++.+++++++++++++++++++++++++>.
++++++++++>+++++...........................................................+++++
Not enough random bytes available. Please do some other work to give
the OS a chance to collect more entropy! (Need 290 more bytes)
透過在鍵盤上打字並移動滑鼠,你可以幫助生成熵或隨機果汁。
你可能會問自己……為什麼我需要熵?以及為什麼它對於隨機數真的變得隨機如此重要?那麼,假設我們的熵的來源僅限於鍵盤、滑鼠和磁碟 IO 的資料。但是我們的系統是一個伺服器,所以我知道沒有滑鼠和鍵盤輸入。這意味著唯一的因素是你的 IO。如果它是一個單獨的、幾乎不使用的磁碟,你將擁有較低的熵。這意味著你的系統隨機的能力很弱。換句話說,我可以玩機率遊戲,並大幅減少破解 ssh 金鑰或者解密你認為是加密會話的時間。
好的,但這是很難實現的對吧?不,實際上並非如此。看看這個 Debian OpenSSH 漏洞[1]。這個特定的問題是由於某人刪除了一些負責新增熵的程式碼引起的。有傳言說,他們因為它導致 valgrind 發出警告而刪除了它。然而,在這樣做的時候,隨機數現在少了很多隨機性。事實上,熵少了很多,因此暴力破解變成了一個可行的攻擊向量。
希望到現在為止,我們理解了熵對安全性的重要性。無論你是否意識到你正在使用它。
/dev/random 和 /dev/urandom
/dev/urandom
是一個偽隨機數生成器,缺乏熵它也不會停止。
/dev/random
是一個真隨機數生成器,它會在缺乏熵的時候停止。
大多數情況下,如果我們正在處理實際的事情,並且它不包含你的核心資訊,那麼 /dev/urandom
是正確的選擇。否則,如果就使用 /dev/random
,那麼當系統的熵耗盡時,你的程式就會變得有趣。無論它直接失敗,或只是掛起——直到它獲得足夠的熵,這取決於你編寫的程式。
檢查熵
那麼,你有多少熵?
[root@testbox test]# cat /proc/sys/kernel/random/poolsize
4096
[root@testbox test]# cat /proc/sys/kernel/random/entropy_avail
2975
/proc/sys/kernel/random/poolsize
,說明熵池的大小(以位為單位)。例如:在停止抽水之前我們應該儲存多少隨機果汁。/proc/sys/kernel/random/entropy_avail
是當前池中隨機果汁的數量(以位為單位)。
我們如何影響這個數字?
這個數字可以像我們使用它一樣耗盡。我可以想出的最簡單的例子是將 /dev/random
定向到 /dev/null
中:
[root@testbox test]# cat /dev/random > /dev/null &
[1] 19058
[root@testbox test]# cat /proc/sys/kernel/random/entropy_avail
0
[root@testbox test]# cat /proc/sys/kernel/random/entropy_avail
1
影響這個最簡單的方法是執行 Haveged[2]。Haveged 是一個守護行程,它使用處理器的“抖動”將熵新增到系統熵池中。安裝和基本設定非常簡單。
[root@b08s02ur ~]# systemctl enable haveged
Created symlink from /etc/systemd/system/multi-user.target.wants/haveged.service to /usr/lib/systemd/system/haveged.service.
[root@b08s02ur ~]# systemctl start haveged
在流量相對中等的機器上:
[root@testbox ~]# pv /dev/random > /dev/null
40 B 0:00:15 [ 0 B/s] [ <=> ]
52 B 0:00:23 [ 0 B/s] [ <=> ]
58 B 0:00:25 [5.92 B/s] [ <=> ]
64 B 0:00:30 [6.03 B/s] [ <=> ]
^C
[root@testbox ~]# systemctl start haveged
[root@testbox ~]# pv /dev/random > /dev/null
7.12MiB 0:00:05 [1.43MiB/s] [ <=> ]
15.7MiB 0:00:11 [1.44MiB/s] [ <=> ]
27.2MiB 0:00:19 [1.46MiB/s] [ <=> ]
43MiB 0:00:30 [1.47MiB/s] [ <=> ]
^C
使用 pv
我們可以看到我們透過管道傳遞了多少資料。正如你所看到的,在執行 haveged
之前,我們是 2.1 位/秒(B/s)。而在開始執行 haveged
之後,加入處理器的抖動到我們的熵池中,我們得到大約 1.5MiB/秒。
via: http://jhurani.com/linux/2017/11/01/entropy-explained.html
作者:James J[4] 譯者:geekpi 校對:wxy
本文由 LCTT 原創編譯,Linux中國 榮譽推出