dev / urandomからの読み取り-システムの動作
dev/urandom
、sayhead
またはdd
、から読み取る場合、出力は常にランダムで異なることが予想されます。
これはUNIXによって低レベルでどのように処理されますか?ファイルは読み取り時に自然に切り捨てられますか、それともファイルは実際には対称暗号または同等のもののインターフェイスであり、そのため「読み取り」は実際には暗号を実行する行為です。
回答
/dev/urandom
は文字デバイスであり、通常のファイルではありません。それを開くと、通常はカーネル内で読み取りを処理するドライバーへのインターフェイスが提供されます。プログラムがから読み取るたび/dev/urandom
に、ドライバーが呼び出され、ドライバーは適切なコンテンツを提供する方法を決定します(他の文字デバイスと同じ— /dev/null
、/dev/zero
...)。
Linuxでは、これはに実装されていdrivers/char/random.cます。ランダムデータのさまざまなソースからシードされた「エントロピープール」を維持し、読み取られると、ChaChaストリーム暗号を使用してプールデータを処理し、返すデータを構築します。
/dev/urandom
「通常のファイル」ではなく(はい、これはPOSIXの命名です)、デバイスです。/ dev /のほとんどの「ファイル」と同じように、そこにはたくさんの魔法の振る舞いがあります。
- あなたが持っている
/dev/null
、あなたがいくら書いても、それは決して満たされません - あなたはランダム/ランダム/ランダムで、毎回ランダムに異なるデータを提供します
- あなたは持って
/dev/tty
どこ相互作用端末と(と同僚) /dev/full
書き込みを試みると、常に「デバイスにスペースが残っていません」を返すものがあります- あなたは
/dev/zero
nulバイトの無限のセットを返すものを持っています
などなど。
これらのファイルは、実際にはカーネルモジュールと対話するためのインターフェイスです。あなたはそれを「読み取り」ときに、それは実際に(あなたのプログラム(頭、DDなど)バイト限り読むように頼まれる機能を要求して実行され/dev/urandom
ているキャラクタデバイス)。次に、この関数は、そのバッファーを埋めるために(この場合、疑似ランダムコンテンツを取得するために)内部で(いくつかのエントロピープールに基づいて)それを処理します。