EN JA
RANDOM(4)
RANDOM(4) FreeBSD Kernel Interfaces Manual RANDOM(4)

名称

randomエントロピデバイス

書式

device random

解説

random デバイスは、読み込まれるとき、乱数バイトを無限に提供して返します。また、それは、任意の通常 (で自発的な) のファイルとしてデータを受け入れて読み込みますが、それに書き込むデータは、破棄します。デバイスは、特定のハードウェアエントロピソースをプローブ (調べて) して、ソフトウェアで実装されたジェネレータである代替システム (フォールバック) に優先してこれらを使用します。

ソフトウェアジェネレータは、 シードがない (unseeded) 状態で開始し、(再) シードであるまで、読み込みは、ブロックします。これは、キーなどが /dev/random から生成されるとき、システムブートでトラブルを引き起こすかもしれないので、ステップは、できるだけ早く再シードを保証するために取られるべきです。 シードされる 状態 (以下を参照) を制御する sysctl(8) は、セキュリティが問題でないか、またはセットアップまたは開発の間に便宜のためであるなら、使用されます。

乱数発生器のこの初期のシードは、非常に注意深い対処を必要とするブートストラップの問題です。ある場合には、システムが完全に操作可能であるが、システムが完全に操作可能になる乱数に要求するまで、乱数発生器をシードするのに十分な乱数を見つけることは難しいかもしれません。それ (またはより正確であるべき) が、はじめて使用される前に、 random デバイスがシードされることは、とても重要です。ダミーまたは "ブロッキングのみ"のデバイスが使用される場合に、それは、読み込みのブロックが重大なプロセスを維持されないことを保証することは、システムの構築者の責任です。

ソフトウェア random デバイスの現在の設定を見るためには、次のコマンド行を使用します:

sysctl kern.random

これは、次のような結果となります:

kern.random.adaptors: yarrow,dummy 
kern.random.active_adaptor: yarrow 
kern.random.yarrow.gengateinterval: 10 
kern.random.yarrow.bins: 10 
kern.random.yarrow.fastthresh: 96 
kern.random.yarrow.slowthresh: 128 
kern.random.yarrow.slowoverthresh: 2 
kern.random.sys.seeded: 1 
kern.random.sys.harvest.ethernet: 1 
kern.random.sys.harvest.point_to_point: 1 
kern.random.sys.harvest.interrupt: 1 
kern.random.sys.harvest.swi: 1

kern.random.adaptors

以外のすべての設定は、読み込み/書き込みです。

kern.random.sys.seeded 変数は、 random デバイスが再シード (種とする) の結果として容認できる安全な状態であるかどうかを示します。 0 に設定されるなら、デバイスは、エントロピ捕獲の結果として、次の再シードまで (読み込み時に) ブロックします。再シードは、値を 1 に設定します (非ブロック)。

kern.random.sys.harvest.ethernet 変数は、エントロピソースとして LAN トラフィックを選択するために使用されます。 0 値は、LAN トラフィックがエントロピソースとみなされないことを意味します。エントロピ獲得のために LAN トラフィックを使用したいなら、変数を 1 に設定してください。

kern.random.sys.harvest.point_to_point 変数は、エントロピソースとしてシリアルライントラフィックを選択するために使用されます。 (シリアルラインタラフィックは、PPP、SLIP およびすべての tun0 トラフィックを含んでいます。) 0 値は、そのようなトラフィックがエントロピソースとみなされないことを意味します。エントロピ獲得のためにそれを使用したいなら、変数を 1 に設定してください。

kern.random.sys.harvest.interrupt 変数は、エントロピソースとしてハードウェア割り込みを選択するために使用されます。 0 値は、ハードウェア割り込みがエントロピソースとみなされないことを意味します。エントロピ獲得のためにそれらを使用したいなら、変数を 1 に設定してください。すべてのハードウェア割り込み獲得は、個々のデバイスドライバによってセットアップされます。

kern.random.sys.harvest.swi 変数は、エントロピソースとしてソフトウェア割り込みを選択するために使用されます。 0 値は、ソフトウェア割り込みがエントロピソースとみなされないことを意味します。エントロピ獲得のためにそれらを使用したいなら、変数を 1 に設定してください。

他の変数は、 http://www.schneier.com/yarrow.htmlYarrow アルゴリズムを記述した論文で説明されています。

これらの変数は、次に含まれる値に関してすべて制限されています:

kern.random.yarrow.gengateinterval
[4..64]
kern.random.yarrow.bins
[2..16]
kern.random.yarrow.fastthresh
[64..256]
kern.random.yarrow.slowthresh
[64..256]
kern.random.yarrow.slowoverthresh
[1..5]

内部の sysctl(3) ハンドラは、上記の変数を定まった範囲に強制されます。

乱数

計算の分野での乱数の使用は、乱数が異なった人々に異なった物を意味するので、かなり微妙な問題です。ランダムにパスワードを生成する、コインを投げる実験をシミュレートする、またはサーバが反応しないとき乱数バックオフ (訳注: 意味不明) 期間を選択すると考えてください。それぞれに関するこれらのタスクは、乱数を必要としますが、乱数には、その都度異なった要件があります。

パスワード、セッションキー、および同様のものの生成は、暗号の乱数を必要とします。暗号の乱数発生器は、(いつシード (種) とされたか、以後や以前の出力などのような) 多くの補助的な情報が知られていたとしても、その出力を推測するのが難しいように設計されるべきです。 FreeBSD では、暗号の乱数発生器のためのシードは、本当の乱数を提供する random デバイスによって提供されます。 arc4random(3) ライブラリ呼び出しは、一般的に簡単な暗号の使用に適していると考えられる擬似乱数シーケンスを提供します。また、OpenSSL ライブラリは、 RAND_bytes(3)RAND_add(3) のような関数を通して乱数を管理するための関数を提供します。 OpenSSL が自動的にシード (種と) するために random デバイスを使用することに注意してください。

シミュレーションのための乱数は、工学または科学的ソフトウェアとゲームで必要とされます。これらのアプリケーションの最初の要件は、生産された乱数がかなり周知で、通常均一で、配布に適合することです。また、数のシーケンスは、シミュレーションがしばしば乱数の入力から独立していると仮定するような相互に関連のない数として現れるべきです。しばしば、ジェネレータが同様に種を蒔かれるなら、発生器が同じ方法でシードされるなら同じ結果を生産すべきであるように、正確にシミュレーションの結果を再生産することは望ましいことです。シミュレーションに関して重要でないことは乱数発生器の速度です。

シミュレーションにおける別の問題は、乱数発生器と関連している状態のサイズと、どのくらいそれ自体を頻繁に繰り返しするかです。例えば、トランプ一組をシャッフルするプログラムは、乱数発生器には、52! の始めの状態がある必要とする 52! の可能な出力があるべきです。これは、プログラムがすべての可能なシーケンスを出力する可能性があるか、プログラムがこれらのビットを発生させる何らかの不遍の方法を必要とするなら、シードは、少なくとも log_2(52!) ~ 226 ビットの状態があるべきであることを意味します。また一方、 random デバイスは、ここでシードするために使用することができましたが、実際のところは、小さいシードは、通常受け付けできると見なされます。

FreeBSD は、シミュレーションに適していると考えられる 2 つの関数ファミリを提供します。 random(3) 関数ファミリは、0 と (2**31)−1 の間の乱数の整数を提供します。関数 srandom(3), initstate(3)setstate(3) は、発生器の状態の確定的な設定を提供し、関数 srandomdev(3) は、 random デバイスを通して状態の設定を提供します。また、 drand48(3) 関数ファミリは、様々な範囲で乱数の浮動小数点数を提供します。

(例えば特定のネットワークプロトコルで) 衝突回避のために使われる乱数は、再びわずかに異なったセマンティクスがあります。これが低い衝突の機会を生み出すとき、通常、数が均一になると予想されます。また一方ここで、発生器のシードは、独立したシーケンスを生産する発生器の異なったインスタンスが必要であるときに、たいへん重要です。しかしながら、シーケンスの推測可能性または再現性は、前の場合と異なって重要ではありません。

また、 FreeBSD は、互換性の目的のための伝統的な rand(3) ライブラリ呼び出しも提供しています。しかしながら、シミュレーションが貧弱で、暗号の目的ためには、絶対に不適当であることが知られているので、使用は、お勧めできません。

関連ファイル

/dev/random

歴史

random デバイスは、 FreeBSD 2.2 で登場しました。初期のバージョンは、Theodore Ts'o の Linux のためのエントロピドライバから取られました。 FreeBSD 5.0 で導入された、現在のソフトウェアの実装は、 Mark R V Murray によって完全に書き直され、Bruce Schneier による Yarrow アルゴリズムの実装です。重要なインフラストラクチャの作業は、Arthur Mesh によって行われました。

作者は、VIA Technologies Inc. からの重要な支援を深く感謝します。

October 12, 2013 FreeBSD