メインコンテンツまでスキップ

7.1.2. The /dev/random Device (/dev/randomデバイス)

7.1.2. The /dev/random Device (/dev/randomデバイス)

UNIXオペレーティングシステムのいくつかのバージョンは, カーネル常駐の乱数生成器を提供しています。これらの生成器の一部は, 通常のシステム動作中にカーネルによってキャプチャされたイベントを使用します。

たとえば, Linuxの一部のバージョンでは, 生成器は512バイトのランダムプールで構成され, それぞれ4バイトの128ワードとして表されます。ディスクドライブ割り込みなどのイベントが発生すると, イベントの時刻がプールにXORされ, プールは次数128の原始多項式によって攪拌されます。プール自体はリングバッファとして扱われ, 新しいデータがプール全体にわたって (多項式で攪拌した後) XORされます。

プールにエントロピーを追加する各呼び出しは, 入力に含まれる可能性のある真のエントロピーの量を推定します。プール自体には, プールの全エントロピーの合計を推定するアキュムレータが含まれています。

入力イベントは, 以下にリストされているいくつかの源から来ます。残念ながら, 人間のオペレーターがいないサーバーマシンの場合, 最初と3番目は利用できず, その場合エントロピーはゆっくり追加される可能性があります。

  1. キーボード割り込み。割り込みの時刻とスキャンコードがプールに追加されます。これは実質的に, キーストローク到着時間間隔を測定することによって人間のオペレーターからエントロピーを追加します。

  2. ディスク完了およびその他の割り込み。人が使用しているシステムは, おそらく予測が難しいディスクアクセスのパターンを持ちます。(ただし, すべてのディスクドライバが有用なほど十分な精度でこのタイミング情報をキャプチャすることをサポートしているわけではありません。)

  3. マウスの動き。タイミングとマウスの位置が追加されます。

ランダムバイトが必要な場合, プールはSHA-1 [SHA*]でハッシュされ, 返されるランダム性のバイトが生成されます。SHA-1の出力 (20バイト) よりも多くのバイトが必要な場合, ハッシュされた出力がプールに攪拌され, 次の20バイトを取得するために新しいハッシュが実行されます。バイトがプールから削除されると, エントロピーの推定値はそれに応じて減少されます。

システム起動時に合理的にランダムなプールを確保するために, 標準の起動およびシャットダウンスクリプトは, シャットダウン時にプールをディスクファイルに保存し, システム起動時にこのファイルを読み取ります。

2つのユーザーエクスポートインターフェースがあります。/dev/randomはプールからバイトを返しますが, 推定エントロピーがゼロに下がったときにブロックします。イベントからエントロピーがプールに追加されると, /dev/randomを介してより多くのデータが利用可能になります。そのような/dev/randomデバイスから取得されたランダムデータは, プールに十分なランダムビットがあるか, 合理的な時間内に追加される場合, 長期鍵の鍵生成に適しています。

/dev/urandomは/dev/randomのように動作します; ただし, ランダムプールのエントロピー推定値がゼロに下がった場合でもデータを提供します。これは, セッション鍵または他の鍵生成タスクに適切である可能性があり, より多くのランダムビットを待つためにブロックすることは受け入れられません。プールのエントロピー推定値が小さい場合でもデータを取り続けるリスクは, 攻撃者がSHA-1を逆転できる場合, 過去の出力が現在の出力から計算可能であることです。SHA-1が非可逆的であるように設計されていることを考えると, これは合理的なリスクです。

Linux, Solaris, または上記のようなコードを装備した他のUNIXシステムで乱数を取得するには, アプリケーションは/dev/randomまたは/dev/urandomを開き, 必要な数のバイトを読み取るだけです。

(Linux Randomデバイスは Theodore Ts'o によって書かれました。PGP 2.XおよびPGP 3.0 (別名PGP 5.0) の乱数生成器に大まかに基づいています。)