Implementation

在 Linux 上,/dev/random 解除阻塞是否意味著 /dev/urandom 已播種?

  • March 31, 2016

Linux 有一個熟悉的問題,即 /dev/random 阻塞太多(堅持在資訊理論上是安全的),而 /dev/urandom 沒有足夠阻塞(它會在數據被充分播種之前返回數據)。新的getrandom()系統呼叫做了正確的事,但在撰寫本文時,它還沒有在主要發行版中普遍可用。

我的問題是:如果我成功地從 /dev/random 讀取了一個字節,這是否意味著 /dev/urandom 已播種?我花了一些時間盯著http://lxr.free-electrons.com/source/drivers/char/random.c但一直沒能弄明白。設備驅動程序提供的熵混合到輸入池中,然後輸入池提供單獨的/dev/random/dev/urandom輸出池,但我無法收集觸發從輸入池傳輸到輸出池的條件,或者(因此)是否可能/dev/random 在 /dev/urandom 餓死時被餵食。

我終於解開了這段程式碼在做什麼。

的。

為什麼這是正確的快速版本是系統收集的前 128 位熵直接混合到非阻塞池中,繞過輸入池。實現這一點的邏輯是每個add_foo_randomness()功能的一部分:

r = nonblocking_pool.initialized ? &input_pool : &nonblocking_pool;

http://lxr.free-electrons.com/source/drivers/char/random.c?v=4.5#L804

http://lxr.free-electrons.com/source/drivers/char/random.c?v=4.5#L924

並且根據http://lxr.free-electrons.com/source/drivers/char/random.c?v=4.5#L677nonblocking_pool.initializedentropy_total超過 128 位時設置。因此,當 /dev/random 提供任何內容時,/dev/urandom 已被播種。

為了完整起見,以下是有關如何管理熵池的其餘部分:

引用自:https://crypto.stackexchange.com/questions/34019