/dev/random と/dev/urandom どちらを使った方がいい?

スポンサーリンク

乱数を生成するデバイスファイルは、/dev/random と/dev/urandom の2つがあります。
似たようなデバイスファイルですが、これ、どちらを使えばいいのでしょう?

/dev/random は読み込みで時々止まる

/dev/random は、時々読み込みでブロッキングされることがあります。
cat /dev/random してみて下さい。
どうでしょう?途中で出力が止まったりしますか?

止まる場合、エントロピープールの枯渇が原因とのこと。再びエントロピープールに一定量たまるまで処理が中断されています。

Linuxで扱う乱数に関する話 | @knok blog
【Linux】/dev/random と /dev/urandomの違い – Man On a Mission

下のコマンドを実行すると、使用可能なエントロピーを確認できます。

cat /proc/sys/kernel/random/entropy_avail

このエントロピー、haveged というエントロピーデーモンを使うと、エントロピープールの量を多い状態へと保つことができます。

Ubuntu では次のようにインストールします。

apt-get install haveged

haveged 前は、cat /proc/sys/kernel/random/entropy_avail 実行で表示される数が、こちらの環境では 200~300付近でした。

haveged インストール後は、2000台に増えました。
cat /dev/random でもブロッキングされることは無くなりました。

暗号関連のプログラムは /dev/random を使っているのか?

さて、先にも参考であげた下記サイトでは、乱数の質は /dev/random の方が上とのこと。
なので、暗号関連のプログラムも /dev/random の方を使っている、らしいですが・・

Linuxで扱う乱数に関する話 | @knok blog

/dev/randomは全ての乱数をエントロピープールから生成します。エントロピーが不足した場合は新たにたまるまでブロッキングされるため、あまり速度が出ません。乱数の質よりも速度に重点を置く場合には、/dev/urandomを使います。

【Linux】/dev/random と /dev/urandomの違い – Man On a Mission

/dev/randomは乱数種を再利用しませんので、/dev/urandomとくらべてより安全な乱数文字列を生成します。
そのため、暗号関連のプログラムが内部処理で利用するのは、通常/dev/randomの方です。

暗号関連のプログラムの代表に openssl があります。
openssl を使っているコマンドに scp がありますが、先の haveged のインストール前後で、scp の転送速度に違いはありませんでした。

そこで、openssl のソースを確認してみました。
該当箇所は crypt/rand/rand_unix.c ですが、/dev/random だけを使っている、ということはありませんでした。
“/dev/urandom”,”/dev/random”,”/dev/srandom” の優先度です。
なので、/dev/urandom の方を使っています。

ということで

・openssl も使っているので、普段使うのは /dev/urandom で良さそう。

・/dev/random を使う場合は読み込みでブロッキングされるが、haveged というエントロピーデーモンをンストールすればいい。

参考

Haveged – ArchWiki
Linuxで扱う乱数に関する話 | @knok blog
【Linux】/dev/random と /dev/urandomの違い – Man On a Mission

コメント

タイトルとURLをコピーしました