乱数を生成するデバイスファイルは、/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
コメント