RANDOM(4) | Linux Programmer's Manual | RANDOM(4) |
名前
random, urandom -カーネル乱数ソースデバイス書式
#include <linux/random.h>説明
(Linux 1.3.30 から提供されている) /dev/random 、 /dev/urandom キャラクタスペシャルファイルはカーネル乱数ジェネレータへのインタフェースを提供する。 /dev/random ファイルはメジャーデバイス番号 1 マイナーデバイス番号 8 である。 /dev/urandom はメジャーデバイス番号 1 マイナーデバイス番号 9 である。乱数ジェネレータはデバイスドライバやその他の源からの環境ノイズをエントロピー・プールへ集める。また、ジェネレータはエントロピー・プール内のノイズのビット数の推定値を保持する。このエントロピー・プールから乱数が生成される。
読み込みが行われると、 /dev/random デバイスはエントロピー・プールのノイズビットの数の推定値のうち、ランダムバイトのみを返す。 /dev/random はワンタイムパッド (one-time pad) や鍵の生成のような非常に高い品質を持った無作為性が必要になる用途に向いているだろう。エントロピー・プールが空の時は、 /dev/random からの読み出しは、更なる環境ノイズが得られるまで、ブロックされる。
/dev/urandom デバイスから読み出しでは、エントロピーがより高くなるのを待つためのブロックは行われない。その結果、もしエントロピー・プールに十分なエントロピーが存在しない場合、返り値はこのドライバで使われているアルゴリズムに基づく暗号攻撃に対して、論理的には弱くなることになる。この攻撃をどのように行うかという事については、現在研究論文などの形で入手できる資料はない、しかし、そのような攻撃は論理的に存在可能である。もし、この事が心配なら、( /dev/urandom ではなく) /dev/random を利用すればいい。
Writing to /dev/random or /dev/urandom will update the entropy pool with the data written, but this will not result in a higher entropy count. This means that it will impact the contents read from both files, but it will not make reads from /dev/random faster.
使い方
/dev/random と /dev/urandom のどちらを使うべきか迷った場合、たいていは /dev/urandom の方を使いたいと思っているはずだろう。一般に、長期に渡って使われる GPG/SSL/SSH のキー以外の全てのものに /dev/urandom を使用すべきである。Configuration
システムにあらかじめ作成された /dev/random と /dev/urandom が存在しないなら、次のようなコマンドで作成できる。mknod -m 644 /dev/random c 1 8
mknod -m 644 /dev/urandom c 1 9
chown root:root /dev/random /dev/urandom
echo "Initializing random number generator..."
random_seed=/var/run/random-seed
# 乱数種を今回のスタートアップから次回のスタートアップまで持ち越す。
# ロードを行い、その後、全てのエントロピー・プールを保存する。
if [ -f $random_seed ]; then
cat $random_seed >/dev/urandom
else
touch $random_seed
fi
chmod 600 $random_seed
poolfile=/proc/sys/kernel/random/poolsize
[ -r $poolfile ] && bytes=`cat $poolfile` || bytes=512
dd if=/dev/urandom of=$random_seed count=1 bs=$bytes
# 乱数種を今回のシャットダウンから次回のスタートアップまで持ち越す。
# 全てのエントロピー・プールを保存する。
echo "Saving random seed..."
random_seed=/var/run/random-seed
touch $random_seed
chmod 600 $random_seed
poolfile=/proc/sys/kernel/random/poolsize
[ -r $poolfile ] && bytes=`cat $poolfile` || bytes=512
dd if=/dev/urandom of=$random_seed count=1 bs=$bytes
/proc インタフェース
ディレクトリ /proc/sys/kernel/random にあるファイル (2.3.16 から存在する) は、 /dev/random デバイスへのその他のインタフェースを提供する。読み込み専用のファイル entropy_avail は使用可能なエントロピーを表す。通常、これは 4096 (ビット) になり、エントロピー・プールが満杯の状態である。
ファイル poolsize はエントロピー・プールのサイズを表す。このファイルの意味はカーネルバージョンにより異なる。
- Linux 2.4:
- このファイルはエントロピー・プールのサイズを「バイト」単位で規定する。通常、このファイルの値は 512 になるが、書き込み可能であり、アルゴリズムで利用可能な任意の値に変更できる。選択可能な値は 32, 64, 128, 256, 512, 1024, 2048 である。
- Linux 2.6:
- このファイルは読み出し専用であり、エントロピー・プールのサイズを「ビット」単位で規定する。値は 4096 である。
ファイル read_wakeup_threshold は /dev/random からのエントロピーを待って休止しているプロセスを起こすのに必要なエントロピーのビット数を保持している。デフォルトは 64 である。ファイル write_wakeup_threshold はエントロピーのビット数を保持しており、この値以下になったら /dev/random への書き込みアクセスのために select(2) または poll(2) を実行するプロセスを起こす。この値はファイルに書き込みを行うことによって変更できる。
読み込み専用のファイル uuid と boot_id は 6fd5a44b-35f4-4ad4-a9b9-6b9be13e1fe9 のようなランダムな文字列を保持している。前者は読み込みの度に新たに生成され、後者は 1 度だけ生成される。
ioctl(2) インタフェース
The following ioctl(2) requests are defined on file descriptors connected to either /dev/random or /dev/urandom. All requests performed will interact with the input entropy pool impacting both /dev/random and /dev/urandom. The CAP_SYS_ADMIN capability is required for all requests except RNDGETENTCNT.- RNDGETENTCNT
- Retrieve the entropy count of the input pool, the contents will be the same as the entropy_avail file under proc. The result will be stored in the int pointed to by the argument.
- RNDADDTOENTCNT
- Increment or decrement the entropy count of the input pool by the value pointed to by the argument.
- RNDGETPOOL
- Removed in Linux 2.6.9.
- RNDADDENTROPY
- Add some additional entropy to the input pool, incrementing the entropy count. This differs from writing to /dev/random or /dev/urandom, which only adds some data but does not increment the entropy count. The following structure is used:
-
struct rand_pool_info {
int entropy_count;
int buf_size;
__u32 buf[0];
};
- Here entropy_count is the value added to (or subtracted from) the entropy count, and buf is the buffer of size buf_size which gets added to the entropy pool.
- RNDZAPENTCNT, RNDCLEARPOOL
- Zero the entropy count of all pools and add some system data (such as wall clock) to the pools.
ファイル
/dev/random関連項目
mknod(1)この文書について
この man ページは Linux man-pages プロジェクトのリリース 3.51 の一部である。プロジェクトの説明とバグ報告に関する情報は http://www.kernel.org/doc/man-pages/ に書かれている。2013-03-15 | Linux |