/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 は、起動時以外はブロックが発生しません。
関連記事
- PHPのPEARは2019年に改ざんされたことがあります
- SSDの現在のTBWを調べる方法 SSDの残り寿命 (Windows Linux CentOS)
- RAIDの種類
- NTFSのディスクをLinuxにマウントすると読み込み専用でマウントされてしまう
- Ubuntu/Debian/Raspberry PiでChia Network(XCH)をHDDマイニングする方法
- CentOSでChia Network(XCH)をHDDマイニングする方法
- 仮想通貨Chia Network(XCH)とは 多くの報酬を得る方法
- PCやスマホがネットワーク内にあるかどうかを調べる(在宅かどうかの判断)
- Raspberry Piを使用するときに必要なもの
- Raspberry Piで使えるmicroSDカードの容量(最小容量 最大容量)
- FAT(File Allocation Table)ファイルシステムの仕様 FAT16 FAT32 exFAT VFAT
- Raspberry Pi 4 Model Bのチップ・無線LANアンテナ
- Raspberry Pi Zero WHのチップ・無線LANアンテナ(大きなチップはCPUではありません)
- Raspberry Piの選び方・用途別のおすすめモデル
- Raspberry Piの各モデルスペック比較
- GnuTLS: The Diffie-Hellman prime sent by the server is not acceptable (not long enough).の解決法
- Linux・WindowsでMTUを変更する方法(ジャンボフレーム)
- LinuxでPDFを画像に変換したりテキストを抽出する方法
- Linuxにffmpegをインストールする方法 CentOS Stream
- SELinuxの管理で使用するsemanageコマンドをインストールする方法
- LinuxにImageMagickをインストールする方法 CentOS Stream
- Linuxでrarファイルを圧縮・解凍する方法(CentOS)
- Linuxで接続されているUSBのバージョンを確認する方法
- Linuxでストレージの型番やシリアルを確認する方法(HDD SSD NVMe)
- CPUやストレージの温度を調べる方法(CPU HDD SSD NVMe)
- CentOS7からCentOS8へのアップグレード
- 各ストレージの速度一覧 規格速度や実効速度(HDD/SSD/M2/NVMe/USBメモリ)
- Poderosa5で「インデックスが配列の境界外です。」と出る場合の対処法(CentOS8 Ubuntu)
- VirtualBox Interfaceが起動していてシャットダウンができないとき
- HPのパソコンでVirtualBoxが起動しない(HP ProtectTools Security Manager)
- phpMyAdminでログイン画面を出さずにデータベースに接続する方法
- PHPでMySQLなどにPDO接続をすると、could not find driverのエラーが出る場合
- ホスト名(ドメイン)をローカルIPに名前解決させる方法(ローカルDNS不要)
- SONYのnasneをLinuxにマウントする方法
- 数日おきに設定したcronの実行が1日ずれる理由
- LinuxでNTFS(Windows形式)のフォーマットをする方法
- target is busyやdevice is busyをumountする方法
- 2TBを超えるHDDを増設する方法(パーティション・フォーマット)
- 破損したストレージからのデータ復旧
- HDDやSSDなどのストレージをリスト形式で表示する方法
- blkidコマンドでUUIDが表示されない場合
- HDDやSSDなどのストレージのUUIDを調べる方法
- glibcを更新するとdateコマンドが新元号の令和に対応します
- ata1.00: SRST failed(errno=-16) と出る場合
- cron設定ファイルの実体の保存先
- Fail2ban ログを集計して不正アクセスを防ぐ
- CD-RやDVD-Rを使わずUSBメモリでLinuxをインストールする方法(ISO boot)
- VBoxGuestAdditions.iso の場所
- 『Table is marked as crashed and should be repaired』の修復方法
- PostfixサーバからGmailサーバへメールを送信できない場合の対処法
- Apacheをコマンドプロンプトから起動・停止・再起動する方法
- wgetが遅い場合の対処法
- WgetがFTPでダウンロードできない場合
- WgetがSSLでダウンロードできない場合
- Wgetの基本的な使い方など(ユーザーエージェントの設定・POSTデータの送信)
- lsコマンドで秒を表示する方法(タイムスタンプの書式指定)
- PDO_MYSQLをインストールする方法
- PEAR・PECLをインストールする方法
- シェルスクリプトを実行すると『そのようなファイルやディレクトリはありません』や『コマンドが見つかりません』と出る場合
- 画面のバックライトを消す方法(モニタ電源を消す) vbetool
- telnetの反応がなくなった時に接続を強制的に切断する方法
- サーバの負荷や使用率などを見るコマンドの一覧
- PHPでロードアベレージを表示させる方法
- Apacheで出力されるログを変更する方法 レスポンスにかかった時間やリファラ、ユーザーエージェントを記録する
- ログをリアルタイムに表示させて監視する方法
- 起動時にネットワークを有効にする方法(eth0を起動する方法)
- IPアドレスを変更する方法
- cron実行時の標準出力のメールを飛ばさない方法(cron実行時に毎回メールを飛ばさない)
- cron実行時のPATHなどの環境変数を確認する方法
- cronのメール送信先を指定する方法(cronごとに送信先のメールアドレスを指定する方法)
- cron実行時に『/bin/sh: 〜〜: command not found』と出てcronが実行されない場合
- 『crontab -r』でcronの設定を間違って消してしまった場合の対処法
- cronを実行すると『TERM environment variable not set.』というエラーメールが飛ぶ
- Apacheから2GB以上のファイルをダウンロードしようとすると403エラーが出ます
- [warn] _default_ VirtualHost overlap on port 80, the first has precedence エラー
- Zend Serverとは
- 特定のディレクトリのみベーシック認証を外す方法
- Cactiのインストール RRDToolを利用したサーバ監視ツール
- svn: '/home' does not appear to be a URL 同サーバ内にあるリポジトリの指定
- SVNリポジトリを別のサーバに移行する方法
- svn: Repository moved temporarily; please relocate PROPFIND request failed
- PEARを更新する方法
- locateデータベースの更新
- JP106キーボードを使用する設定
- VirtualBoxでホストOSと同じネットワークにする方法
- VMware Serverのファイル・サービス
- VirtualBox、仮想OSのインストール
- IPアドレス制限とベーシック認証を併用する方法
- memcachedの仕組み(オンメモリストレージ・Slab Allocator)
- 会員専用ページを作る方法 (ベーシック認証 / Basic認証 / 基本認証)
- CGI(Perl)をApacheで使用するときの設定
- NTPサーバで時計を調節する (the NTP socket is in use, exiting とは)
- CVSについて
- Oracle Berkeley DBのインストール
- VMware Serverの使い方
- VMWare Serverのインストール
- webサーバーのレスポンスコード
- Linux [Red Hat/CentOSなど]
- Windows
- Mercurial
- FreeBSD
- SVN(Subversion/サブバージョン)
- cron
- Vagrant(ベイグラント)
- Git
- AWS
- Samba
- HomeBridge
スポンサーリンク