Home
Packages
Forums
Wiki
GitLab
Security
AUR
Download
コンテンツにスキップ
メインメニュー
メインメニュー
サイドバーに移動
非表示
案内
メインページ
目次
コミュニティに貢献
最近の出来事
おまかせ表示
特別ページ
交流
ヘルプ
貢献
最近の更新
最近の議論
新しいページ
統計
リクエスト
ArchWiki
検索
検索
表示
アカウント作成
ログイン
個人用ツール
アカウント作成
ログイン
乱数生成のソースを表示
ページ
議論
日本語
閲覧
ソースを閲覧
履歴を表示
ツール
ツール
サイドバーに移動
非表示
操作
閲覧
ソースを閲覧
履歴を表示
全般
リンク元
関連ページの更新状況
ページ情報
表示
サイドバーに移動
非表示
←
乱数生成
あなたには「このページの編集」を行う権限がありません。理由は以下の通りです:
この操作は、次のグループに属する利用者のみが実行できます:
登録利用者
。
このページのソースの閲覧やコピーができます。
[[Category:暗号化]] [[en:Random number generation]] [[Wikipedia:Random number generation]] より: :''乱数生成器 (RNG) とはパターンの存在しない (つまりランダムな) 数字や記号の羅列を生成するための計算法または物理デバイスのこと。'' ランダムなデータの生成はアプリケーションによってはとても重要なことです。([[ディスク暗号化]]などに用いる) 暗号鍵の作成や[[ディスクの完全消去|ディスクの完全消去]]、暗号化された[[ソフトウェアアクセスポイント]]など。 == カーネル内蔵の RNG == カーネルに含まれている RNG である [[wikipedia:ja:/dev/random|/dev/{u}random]] は暗号鍵の作成などに使われるような高いセキュリティレベルを必要とするランダムデータの生成を行うときに使うことを強く推奨されます。この乱数生成器はデバイスドライバなどの情報源から環境ノイズをエントロピープールに集めます。 {{ic|man random}} コマンドではライブラリ関数の man ページ {{man|3|random}} が表示されてしまうので注意してください。{{ic|/dev/random}} デバイスに関する情報が必要なときは {{ic|man 4 random}} を実行して表示される {{man|4|random}} を読んで下さい。 === /dev/random === {{ic|/dev/random}} は4096ビット (512バイト) のエントロピープールを使用してランダムデータを生成します。エントロピープールが空になると、プールがまた補充されるまで待機します (これには時間がかかります)。{{ic|/dev/random}} は暗号鍵 (SSL, SSH, dm-crypt の LUKS など) の生成のために設計されており、HDD の中身の消去に使うのは現実的ではありません。システムに[[Wikipedia:Hardware_random_number_generator#Using_observed_events|十分なエントロピーが収集される]]まで止まってしまって、ディスクの消去にものすごく時間がかかるためです。エントロピーが枯渇しているような環境だと (例: リモートサーバー)、永遠に終わらないかもしれません。巨大なディレクトリで検索コマンドを実行するとか、X でマウスを動かすなどをすればエントロピープールは段々と溜まっていきますが、そもそもプールサイズ自体がディスクの消去を行うには不十分な造りになっています。 {{ic|/proc/sys/kernel/random/entropy_avail}} と {{ic|/proc/sys/kernel/random/poolsize}} を比較することでシステムのエントロピープールを目で追うことができます。 Linux カーネル 2.4 ではエントロピーのプールサイズを変更できるように書き換え可能な {{ic|/proc}} エントリが出来ましたが、新しいカーネルでは {{ic|read_wakeup_threshold}} と {{ic|write_wakeup_threshold}} しか書き換えできないようになっています。現在、プールサイズはカーネルの {{ic|/drivers/char/random.c}} の275行目でハードコード (決め打ち) されています: {{bc|/* * Configuration information */ #define '''INPUT_POOL_WORDS 128''' #define '''OUTPUT_POOL_WORDS 32''' ...}} カーネルのプールサイズは {{ic|INPUT_POOL_WORDS * OUTPUT_POOL_WORDS}} で求めることができ、既に述べたように、4096ビットとなります。 {{Warning|あなたの [http://everything2.com/title/Compromising+%252Fdev%252Frandom 制御下] にない環境では {{ic|/dev/random}} を使って''重要な''暗号鍵を生成してはいけません。例えば、共有サーバーの環境などを想定してください。別の環境で鍵を作成してから転送するようにしましょう。暗号学者 D. J. Bernstein はこの問題を [http://blog.cr.yp.to/20140205-entropy.html Mark Twain の名言] で説明しています。}} === /dev/urandom === {{ic|/dev/random}} と反対に、{{ic|/dev/urandom}} は初期のランダムなシードを使ってストリーム暗号の元とします [https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=e192be9d9a30555aae2ca1dc3aad37cba484cd4a] (カーネル 4.8 以上)。 ストリーム暗号を使用することで、ディスクの徹底消去や[[ディスクの完全消去#ブロックデバイス暗号化の準備|ブロックデバイス暗号化の準備]]、LUKS キースロットの消去などの目的に叶うような高品質な疑似乱数データを大量に生成します。 {{Warning|長期間の暗号鍵を生成するのに {{ic|/dev/urandom}} は推奨されません。}} システムの状態や乱数の目的によって使用価値は大きく変わります。例えば、システムが立ち上がったばかりなのか、あるいはエントロピープールを十分に満たすだけの時間を経ているのかは大変重要です。 以下の記事は様々な視点から {{ic|/dev/urandom}} の有用性を説明しています: * [http://www.2uo.de/myths-about-urandom/ Myths about urandom] - 非常に勉強になりますが誤謬も含まれています。 * [http://sockpuppet.org/blog/2014/02/25/safely-generate-random-numbers/ Safely generate random numbers] - エントロピーの収集についてカーネルの仕組みを変更しようとしたときに考えるべきことを説明しています。 Arch Linux の場合、{{ic|/dev/urandom}} には以下のことが当てはまります: # 可能であればカーネルの {{ic|getrandom()}} システムコールを使ってください。{{ic|/dev/urandom}} が正しく初期化されていることを確認できます。{{man|2|getrandom}} を参照。 # {{ic|/dev/urandom}} デバイスを使用して長期目的でエントロピーを生成する場合、正しく初期化されることを必ず確認してください。 # 起動時に {{ic|/dev/urandom}} のエントロピーを使用する重要なサービスがある場合は注意してください。最近のシステムでもカーネルのエントロピー初期化は数秒かかることがあり、(仮想化環境など) 場合によってはさらに時間がかかります。カーネルは警告はしますが、いつまでもというわけではありません [https://patchwork.kernel.org/patch/9173499/]。 出力例: $ dmesg | grep -e random: ... [ 0.844818] random: systemd-udevd: uninitialized urandom read (16 bytes read) [ 7.022171] random: fast init done [ 12.916705] random: crng init done 上記の例では、プールを初期化する十分なエントロピーをカーネルが収集する前にデフォルトのブートターゲットに達してしまっています。systemd は起動の初期段階でエントロピーを必要とするため [https://github.com/systemd/systemd/issues/4167]、ブートプロセスでエントロピープールが枯渇してしまう可能性があります。 起動段階で問題があると、{{ic|/dev/urandom}} プールから十分な品質のエントロピーを得られないまま他のサービス (ウェブサーバーの [[OpenSSL]] セッションなど) が起動します。そして、OpenSSL の通常の設定では同じシードを使い続け、新しいシードを要求するのはセッションを再起動したときだけです。 == 代替案 == 長い暗号鍵の生成などは行わないアプリケーションの場合、パフォーマンスとセキュリティの折り合いをつけて[[Wikipedia:ja:擬似乱数|擬似乱数生成器]]を使うこともあります。Arch Linux のリポジトリには以下のような擬似乱数生成器が存在します: * [[Haveged]] * [[rng-tools]] [[Wikipedia:Yarrow_algorithm|Yarrow]] (macOS) や [[Wikipedia:Fortuna_(PRNG)|Fortuna]] (FreeBSD Yarrow の後継)のような[[Wikipedia:Cryptographically_secure_pseudorandom_number_generator|暗号的に安全な疑似乱数生成器]]もあります == 参照 == * [https://www.ietf.org/rfc/rfc4086.txt RFC4086 - Randomness Requirements for Security] (Section 7.1.2 for /dev/random) * [http://lkml.indiana.edu/hypermail/linux/kernel/1302.1/00479.html Linux Kernel ML] - /dev/random のスループットを高めるパッチの議論 (2013年2月) * [http://eprint.iacr.org/2013/338 A challenge on /dev/random robustness] (2013年6月) * [http://eprint.iacr.org/2014/167 エントロピーが少ない状態での /dev/random, Yarrow, Fortuna の挙動の解析] (2014年3月) * [http://www.random.org/randomness/ Randomness] - 様々な RNG について説明している科学記事 * [http://www.fourmilab.ch/random/ ENT] - ランダムシーケンスをテストするシンプルなプログラム (エントロピー, カイ二乗検定, モンテカルロ, 相関など) * [http://www.codeproject.com/Articles/795845/Arduino-Hardware-Random-Sequence-Generator-with-Ja DIY HRNG] - 安価な DIY の Arduino HRNG の例 * [https://eprint.iacr.org/2016/367 An Analysis of OpenSSL's Random Number Generator] - Paper on RNG reseeding risks in OpenSSL functionality * [http://www.chronox.de/lrng/doc/lrng.pdf Linux Random Number Generator – A New Approach] - デバイスのアップデートに関する論文 (2017年3月)
このページで使用されているテンプレート:
テンプレート:Ic
(
ソースを閲覧
)
テンプレート:Man
(
ソースを閲覧
)
テンプレート:Note
(
ソースを閲覧
)
乱数生成
に戻る。
検索
検索
乱数生成のソースを表示
話題を追加