dev / urandomからの読み取り-システムの動作

Aug 24 2020

dev/urandom、sayheadまたはdd、から読み取る場合、出力は常にランダムで異なることが予想されます。

これはUNIXによって低レベルでどのように処理されますか?ファイルは読み取り時に自然に切り捨てられますか、それともファイルは実際には対称暗号または同等のもののインターフェイスであり、そのため「読み取り」は実際には暗号を実行する行為です。

回答

13 StephenKitt Aug 24 2020 at 21:15

/dev/urandomは文字デバイスであり、通常のファイルではありません。それを開くと、通常はカーネル内で読み取りを処理するドライバーへのインターフェイスが提供されます。プログラムがから読み取るたび/dev/urandomに、ドライバーが呼び出され、ドライバーは適切なコンテンツを提供する方法を決定します(他の文字デバイスと同じ— /dev/null/dev/zero...)。

Linuxでは、これはに実装されていdrivers/char/random.cます。ランダムデータのさまざまなソースからシードされた「エントロピープール」を維持し、読み取られると、ChaChaストリーム暗号を使用してプールデータを処理し、返すデータを構築します。

8 Ángel Aug 24 2020 at 21:44

/dev/urandom「通常のファイル」ではなく(はい、これはPOSIXの命名です)、デバイスです。/ dev /のほとんどの「ファイル」と同じように、そこにはたくさんの魔法の振る舞いがあります。

  • あなたが持っている/dev/null、あなたがいくら書いても、それは決して満たされません
  • あなたはランダム/ランダム/ランダムで、毎回ランダムに異なるデータを提供します
  • あなたは持って/dev/ttyどこ相互作用端末と(と同僚)
  • /dev/full書き込みを試みると、常に「デバイスにスペースが残っていません」を返すものがあります
  • あなたは/dev/zeronulバイトの無限のセットを返すものを持っています

などなど。

これらのファイルは、実際にはカーネルモジュールと対話するためのインターフェイスです。あなたはそれを「読み取り」ときに、それは実際に(あなたのプログラム(頭、DDなど)バイト限り読むように頼まれる機能を要求して実行され/dev/urandomているキャラクタデバイス)。次に、この関数は、そのバッファーを埋めるために(この場合、疑似ランダムコンテンツを取得するために)内部で(いくつかのエントロピープールに基づいて)それを処理します。