歡迎光臨
每天分享高質量文章

/dev/[u]random:對熵的解釋 | Linux 中國

當談到 /dev/random 和 /dev/urandom 的主題時,你總是會聽到這個詞:“熵(Entropy)”。
— James J


致謝
編譯自 | http://jhurani.com/linux/2017/11/01/entropy-explained.html 
 作者 | James J
 譯者 | geekpi ? ? 共計翻譯:727 篇 貢獻時間:1679 天

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

如果你曾經生成過 SSL 證書或 GPG 金鑰,那麼可能已經看到過像下麵這樣的內容:

  1. We need to generate a lot of random bytes. It is a good idea to perform

  2. some other action (type on the keyboard, move the mouse, utilize the

  3. disks) during the prime generation; this gives the random number

  4. generator a better chance to gain enough entropy.

  5. ++++++++++..+++++.+++++++++++++++.++++++++++...+++++++++++++++...++++++

  6. +++++++++++++++++++++++++++++.+++++..+++++.+++++.+++++++++++++++++++++++++>.

  7. ++++++++++>+++++...........................................................+++++

  8. Not enough random bytes available. Please do some other work to give

  9. 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,那麼當系統的熵耗盡時,你的程式就會變得有趣。無論它直接失敗,或只是掛起——直到它獲得足夠的熵,這取決於你編寫的程式。

檢查熵

那麼,你有多少熵?

  1. [root@testbox test]# cat /proc/sys/kernel/random/poolsize

  2. 4096

  3. [root@testbox test]# cat /proc/sys/kernel/random/entropy_avail

  4. 2975

/proc/sys/kernel/random/poolsize,說明熵池的大小(以位為單位)。例如:在停止抽水之前我們應該儲存多少隨機果汁。/proc/sys/kernel/random/entropy_avail 是當前池中隨機果汁的數量(以位為單位)。

我們如何影響這個數字?

這個數字可以像我們使用它一樣耗盡。我可以想出的最簡單的例子是將 /dev/random 定向到 /dev/null 中:

  1. [root@testbox test]# cat /dev/random > /dev/null &

  2. [1] 19058

  3. [root@testbox test]# cat /proc/sys/kernel/random/entropy_avail

  4. 0

  5. [root@testbox test]# cat /proc/sys/kernel/random/entropy_avail

  6. 1

影響這個最簡單的方法是執行 Haveged[2]。Haveged 是一個守護行程,它使用處理器的“抖動”將熵新增到系統熵池中。安裝和基本設定非常簡單。

  1. [root@b08s02ur ~]# systemctl enable haveged

  2. Created symlink from /etc/systemd/system/multi-user.target.wants/haveged.service to /usr/lib/systemd/system/haveged.service.

  3. [root@b08s02ur ~]# systemctl start haveged

在流量相對中等的機器上:

  1. [root@testbox ~]# pv /dev/random > /dev/null

  2.  40 B 0:00:15 [   0 B/s] [                    <=>                                                                                                                                                      ]

  3.  52 B 0:00:23 [   0 B/s] [                           <=>                                                                                                                                               ]

  4.  58 B 0:00:25 [5.92 B/s] [                              <=>                                                                                                                                            ]

  5.  64 B 0:00:30 [6.03 B/s] [                                  <=>                                                                                                                                        ]

  6. ^C

  7. [root@testbox ~]# systemctl start haveged

  8. [root@testbox ~]# pv /dev/random > /dev/null

  9. 7.12MiB 0:00:05 [1.43MiB/s] [                <=>                                                                                                                                                        ]

  10. 15.7MiB 0:00:11 [1.44MiB/s] [                                    <=>                                                                                                                                    ]

  11. 27.2MiB 0:00:19 [1.46MiB/s] [                                                               <=>                                                                                                         ]

  12.  43MiB 0:00:30 [1.47MiB/s] [                                                                                                    <=>                                                                    ]

  13. ^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中國 榮譽推出

贊(0)

分享創造快樂