dev/urandom
を使用またはhead
読み取るとき、dd
出力は常にランダムであり、異なると予想されます。
UNIXは内部的にこの問題をどのように処理しますか?ファイルを読み取るときに自然に切り捨てられるか、ファイルが実際に対称パスワードまたは同等のパスワードへのインターフェースであるため、「読み取り」は実際にパスワードを実行する行為です。
答え1
/dev/urandom
通常のファイルではなく文字デバイスです。これを開くと、通常、カーネルで読み取りを処理するドライバーへのインターフェースが提供されます。プログラムが読み取るたびに/dev/urandom
ドライバが呼び出され、ドライバは適切なコンテンツを提供する方法を決定します(他の文字デバイスと同じです。/dev/null
)/dev/zero
Linuxではそうですdrivers/char/random.c
。 「エントロピープール」を維持し、さまざまなランダムデータソースからシードを取得し、返すデータを設定するために読み取るときにChaChaストリームパスワードを使用してプールされたデータを処理します。
答え2
/dev/urandom
「一般ファイル」(例:POSIX 命名)ではなく、デバイスです。 /dev/のほとんどの「ファイル」と同様に、そこには魔法のような動作がたくさんあります。
- 君はいて
/dev/null
、いくら書いても満たされない - 毎回ランダムに異なるデータを提供するランダム/ウランドーム/スランダムがあります。
- あなた(および同僚)が
/dev/tty
端末と対話する場所 /dev/full
書き込みを試みると、常に「デバイスに空き領域がありません」というメッセージが表示されます。/dev/zero
無限のnulバイトセットを返しました。
もっとあります。
このファイルは実際にカーネルモジュールと対話するためのインターフェースです。したがって、これを「読み取る」場合、実際にはプログラム(head、ddなど)が要求された数のバイトを読み取るように要求する関数を実行します/dev/urandom
。特徴装置)。その後、関数はそれを内部的に処理して(複数のエントロピープールに基づいて)対応するバッファを埋めます(この場合は疑似ランダムなコンテンツを取得するため)。