/dev/random と /dev/urandom の違い

/dev/random と /dev/urandom はどちらもランダムな文字列(乱数)を返す擬似デバイスファイルです。

乱数を生成するためには、元となるエントロピープール(エントロピー源)が必要であり、乱数を生成するごとに乱数種(シード)となるエントロピープールが消費される。
エントロピープールが枯渇すると、/dev/random は乱数を生成できなくなりエントロピープールが貯まるまで処理を停止します。
/dev/urandom は、エントロピープールが枯渇すると、内部プールを再利用して乱数を生成し、処理が停止することがありません。

エントロピープールが貯まるまで乱数生成の処理を停止することをブロックといい、urandom は "unlocked" random source の略です。

内部プールを再利用すると、同じ乱数を生成してしまうような乱数の衝突が発生しやすくなります。
このため/dev/random を『真の乱数』、/dev/urandom を『疑似乱数』と呼ぶことがあります。

暗号化鍵を生成するなどセキュリティを重視する場合は /dev/random を使い、ハードディスクのデータ消去で衝突しても構わない乱数を多数必要とする場合は /dev/urandom を使うなどの使い分けをします。

/dev/random /dev/urandom
乱数種(シード) エントロピープールを使用します
エントロピープールが枯渇したとき エントロピープールが貯まるまで処理を停止します エントロピープールを再利用して停止しません
乱数の衝突 発生しにくい 発生しやすい
真の乱数 疑似乱数

FreeBSDでは/dev/urandomは/dev/randomへのシンボリックリンクのため、違いがありません。

エントロピープールとは

エントロピープールは、キーボードやマウスなどの入力デバイスによるイベントやハードディスクの読み込み時間、ネットワークトラフィックなどの環境ノイズから生成されます。

エントロピープールの貯蓄状態

# cat /proc/sys/kernel/random/entropy_avail
157

エントロピープールの上限値

# cat /proc/sys/kernel/random/poolsize
4096

Linuxの実装ではエントロピープールが閾値以下になるとブロックします。
閾値はrandom_read_wakeup_bits=64です。

エントロピープールの問題

乱数を生成するためのエントロピープールは、ランダムである必要があります。
キーボードやマウスなどの入力デバイスがない、CDブートなどでディスクの読み込みがない、ネットワークトラフィックが規則的である場合などでは乱数の衝突が発生しやすくなり安全性が低下します。
仮想化されているマシンでは、ハードウェアも仮想化されているため乱数の質が低下します。

攻撃者が、環境ノイズを制御できたり予測可能な場合、同一の乱数を作り出せる確率が高くなるためセキュリティリスクが大きくなります。

FreeBSDでの実装

/dev/random と /dev/urandom は、OSではLinuxが初めて実装したもので、FreeBSDやUnixにも実装されています。
FreeBSDは、かつては/dev/random と /dev/urandom が別々の実装がされていましたが、Yarrowアルゴリズムでの実装となったため、/dev/urandomは/dev/randomへのシンボリックリンクになっています。

このためFreeBSDの /dev/random は、起動時以外はブロックが発生しません。

関連記事

スポンサーリンク

default修飾子 デフォルト値を設定する

ホームページ製作・web系アプリ系の製作案件募集中です。

上に戻る