Linux

為什麼 /dev/random 中的 dd 給出不同的文件大小?

  • April 21, 2018

我在 ubuntu 系統上執行以下命令:

dd if=/dev/random of=rand bs=1K count=2

但是,每次我執行它時,我都會得到一個不同大小的文件。為什麼是這樣?如何生成填充隨機數據的給定大小的文件?

您正在觀察 的dd特殊行為與 Linux 的特殊行為的組合/dev/random。順便說一句,兩者都很少是適合這項工作的工具。

Linux 會/dev/random謹慎地返回數據。它基於偽隨機數發生器中的熵以非常快的速率消失的假設。由於收集新熵很慢,/dev/random通常一次只放棄幾個字節。

dd是一個舊的、古怪的程序,最初旨在在磁帶設備上執行。當您告訴它讀取一個 1kB 的塊時,它會嘗試讀取一個塊。如果讀取返回的字節數少於 1024 字節,那麼這就是你所得到的。於是dd if=/dev/random bs=1K count=2打了兩個read(2)電話。由於它是從 讀取的/dev/random,因此這兩個read呼叫通常只返回幾個字節,其數量取決於可用的熵。另請參閱dd 何時適合複製數據?(或者,什麼時候 read() 和 write() 部分)

除非您正在設計作業系統安裝程序或複製程序,否則永遠不要/dev/random在 Linux 下使用/dev/urandom. urandom手冊頁有些誤導;/dev/urandom實際上適用於密碼學,甚至可以生成長壽命的密鑰。唯一的限制/dev/urandom是它必須提供足夠的熵;Linux 發行版通常會在重新啟動之間保存熵,因此唯一一次您可能沒有足夠的熵是在全新安裝時。實際上,熵不會消失。有關更多資訊,請閱讀/dev/urandom 中的 rand 對於登錄密鑰是否安全?餵養 /dev/random 熵池?.

的大多數用法dd最好用head或之類的工具來表達tail。如果你想要 2kB 的隨機字節,執行

head -c 2k </dev/urandom >rand

使用較舊的 Linux 核心,您可以擺脫

dd if=/dev/urandom of=rand bs=1k count=2

因為/dev/urandom高興地返回了請求的字節數。但自從核心 3.16 以來,這不再適用,現在限制為 32MB

通常,當您需要使用dd提取固定數量的字節並且其輸入不是來自正常文件或塊設備時,您需要逐字節讀取:dd bs=1 count=2048.

引用自:https://unix.stackexchange.com/questions/32988