Linux中國

/dev/[u]random:對熵的解釋

當談到 /dev/random/dev/urandom 的主題時,你總是會聽到這個詞:「 Entropy 」。每個人對此似乎都有自己的比喻。那為我呢?我喜歡將熵視為「隨機果汁」。它是果汁,隨機數需要它變得更隨機。

如果你曾經生成過 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 漏洞。這個特定的問題是由於某人刪除了一些負責添加熵的代碼引起的。有傳言說,他們因為它導致 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。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 譯者:geekpi 校對:wxy

本文由 LCTT 原創編譯,Linux中國 榮譽推出


本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive

對這篇文章感覺如何?

太棒了
0
不錯
0
愛死了
0
不太好
0
感覺很糟
0
雨落清風。心向陽

    You may also like

    Leave a reply

    您的電子郵箱地址不會被公開。 必填項已用 * 標註

    此站點使用Akismet來減少垃圾評論。了解我們如何處理您的評論數據

    More in:Linux中國