3.4. 乱数ジェネレーターの使用

簡単に解読されない安全な暗号鍵を生成するには、乱数のソースが必要になります。一般的に、番号がよりランダムであればあるほど、一意の鍵を得られる可能性が高まります。乱数生成のエントロピー は通常、コンピューティング環境の「ノイズ」または 乱数ジェネレーター のハードウェアを使用することで獲得されます。
rng-tools パッケージの一部である rngd デーモンは、エントロピーを引き出すために環境ノイズと乱数ジェネレーターの両方が使えます。このデーモンは、乱数度のソースが提供したデータがランダムかどうかをチェックし、その後にカーネルの乱数エントロピープールに保存します。これが生成した乱数は、/dev/random および /dev/urandom の各キャラクターデバイスから利用できます。
/dev/random/dev/urandom の違いは、前者はブロックデバイスであり、適切な乱数出力の生成にエントロピーが不十分だと判断すると、乱数の提供が停止される一方で、/dev/urandom は非ブロックソースであり、カーネルのエントロピープールを再利用して無制限の仮の乱数を提供できる、という点です。ただし、この場合のエントロピーは低くなります。このため、長期の暗号鍵の作成には、/dev/urandom は使用しないでください。
rng-tools パッケージをインストールするには、root で以下のコマンドを実行します。
~]# yum install rng-tools
rngd デーモンを起動するには、root で以下のコマンドを実行します。
~]# service rngd start
デーモンのステータスを確認するには、以下のコマンドを実行します。
~]# service rngd status
オプションのパラメーターを使って rngd デーモンを起動するには、直接これを実行します。たとえば、乱数入力の代替ソース (/dev/hwrandom 以外) を指定するには、以下のコマンドを実行します。
~]# rngd --rng-device=/dev/hwrng
上記のコマンドは、/dev/hwrng を乱数読み取り先のデバイスとして rngd デーモンを起動します。同様に、-o (または --random-device) オプションを使うと、乱数の出力に (デフォルトの /dev/random ではなく) カーネルデバイスを選択します。利用可能なオプションについては、rngd(8) の man ページを参照してください。
rng-tools パッケージには rngtest ユーティリティーも含まれており、これはデータの乱数度のチェックに使用できます。/dev/random の出力の乱数度をテストするには、以下のように rngtest ツールを使用します。
~]$ cat /dev/random | rngtest -c 1000
rngtest 2
Copyright (c) 2004 by Henrique de Moraes Holschuh
This is free software; see the source for copying conditions.  There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

rngtest: starting FIPS tests...
rngtest: bits received from input: 20000032
rngtest: FIPS 140-2 successes: 1000
rngtest: FIPS 140-2 failures: 0
rngtest: FIPS 140-2(2001-10-10) Monobit: 0
rngtest: FIPS 140-2(2001-10-10) Poker: 0
rngtest: FIPS 140-2(2001-10-10) Runs: 0
rngtest: FIPS 140-2(2001-10-10) Long run: 1
rngtest: FIPS 140-2(2001-10-10) Continuous run: 0
rngtest: input channel speed: (min=308.697; avg=623.670; max=730.823)Kibits/s
rngtest: FIPS tests speed: (min=51.971; avg=137.737; max=167.311)Mibits/s
rngtest: Program run time: 31461595 microseconds
rngtest ツールの出力で failures の数字が大きいと、テストされたデータの乱数度が不十分で信頼すべきでないことを意味します。rngtest ユーティリティーで利用可能なオプションのリストについては、rngtest(1) の man ページを参照してください。