知識マップ: 疑似乱数と本物の乱数の違いとは - どうやって区別するのかを整理
記事「疑似乱数と本物の乱数の違いとは - どうやって区別するのかを整理」の主張を、概念と関係(エッジ)に分解した知識グラフの全体です。各関係には根拠・確認日・確度が付いています。
この記事は、seedと内部状態から決定論的に数列を作る疑似乱数(PRNG)と、熱雑音などの物理現象をエントロピー源に持つ本物の乱数(NRBG)の違いを整理し、実務で使われる安全な乱数APIの多くが物理エントロピー源でseedしたCSPRNG/DRBGのハイブリッド構成であることを示す。出力の見た目だけでは両者を区別できず、統計検定(NIST SP 800-22)も証明ではなく欠陥検出にとどまるため、区別は生成アルゴリズムやseedの出所といった生成器の構成を確認して行うべきだとする。鍵・トークン・nonce・セッションIDのようなセキュリティ用途では、時刻など予測可能な値でseedするとトークンを推測されアカウント乗っ取りにつながりかねず、BCryptGenRandomや.NETのRandomNumberGenerator、Pythonのsecretsといった OS・言語標準のsecure RNG APIを使うべきだとしている。
flowchart LR
accTitle: 疑似乱数と本物の乱数の違いの知識マップ
accDescr: 疑似乱数(PRNG)と本物の乱数(NRBG)の違い、実務のCSPRNG/DRBGがエントロピー源とのハイブリッド構成であること、統計検定が証明ではなく欠陥検出にとどまること、予測可能なseedがトークン予測攻撃につながることを示す図。
prng["疑似乱数(PRNG)"]
true_random_number_generator["本物の乱数(NRBG/TRNG)"]
csprng_drbg["暗号学的疑似乱数(CSPRNG/DRBG)"]
entropy_source["エントロピー源"]
statistical_test_suite["統計検定(NIST SP 800-22)"]
predictable_seed["予測可能なseed(時刻・PIDなど)"]
seed_prediction_attack["seed推測攻撃"]
account_takeover["アカウント乗っ取り"]
bcryptgenrandom["BCryptGenRandom"]
dotnet_randomnumbergenerator[".NET RandomNumberGenerator"]
linux_getrandom["getrandom()"]
python_secrets_module["Pythonのsecretsモジュール"]
java_securerandom["Java SecureRandom"]
security_token_generation["鍵・トークン・nonce・セッションIDの生成"]
simulation_reproducibility["シミュレーション・テストの再現性"]
session_id["セッションID"]
csprng_drbg -->|"前提とする"| entropy_source
true_random_number_generator -->|"前提とする"| entropy_source
csprng_drbg -.->|"で確認できる"| statistical_test_suite
true_random_number_generator -.->|"で確認できる"| statistical_test_suite
predictable_seed -->|"原因になり得る"| seed_prediction_attack
seed_prediction_attack -.->|"原因になり得る"| account_takeover
csprng_drbg -->|"防止する"| seed_prediction_attack
bcryptgenrandom -.->|"実装を担う"| csprng_drbg
dotnet_randomnumbergenerator -->|"利用する"| csprng_drbg
linux_getrandom -->|"利用する"| csprng_drbg
python_secrets_module -->|"利用する"| csprng_drbg
java_securerandom -->|"利用する"| csprng_drbg
csprng_drbg -->|"推奨される対応"| security_token_generation
prng -->|"用いるのは非推奨"| security_token_generation
prng -->|"推奨される対応"| simulation_reproducibility
prng -->|"用いるのは非推奨"| session_id
概念間の関係(全16件)
図と同じ関係を文章でも列挙します。表示している文と機械可読な意味データ(RDFa)は同じ要素に載っています。確度が「確立した関係」のものは直接の関係として、「条件付きの関係」のものは成立条件つきの言明(rdf:Statement)として表現しています。
- 暗号学的疑似乱数(CSPRNG/DRBG)はエントロピー源を前提とします。
- 本物の乱数(NRBG/TRNG)はエントロピー源を前提とします。
- 暗号学的疑似乱数(CSPRNG/DRBG)は統計検定(NIST SP 800-22)で確認できます。
- 本物の乱数(NRBG/TRNG)は統計検定(NIST SP 800-22)で確認できます。
- 予測可能なseed(時刻・PIDなど)はseed推測攻撃の原因になることがあります。
- seed推測攻撃はアカウント乗っ取りの原因になることがあります。
- 暗号学的疑似乱数(CSPRNG/DRBG)はseed推測攻撃を防ぎます。
- BCryptGenRandomは暗号学的疑似乱数(CSPRNG/DRBG)の実装を担います。
- .NET RandomNumberGeneratorは暗号学的疑似乱数(CSPRNG/DRBG)を利用します。
- getrandom()は暗号学的疑似乱数(CSPRNG/DRBG)を利用します。
- Pythonのsecretsモジュールは暗号学的疑似乱数(CSPRNG/DRBG)を利用します。
- Java SecureRandomは暗号学的疑似乱数(CSPRNG/DRBG)を利用します。
- 暗号学的疑似乱数(CSPRNG/DRBG)は鍵・トークン・nonce・セッションIDの生成に対する本記事の推奨です。
- 疑似乱数(PRNG)を鍵・トークン・nonce・セッションIDの生成に用いることは推奨されません。
- 疑似乱数(PRNG)はシミュレーション・テストの再現性に対する本記事の推奨です。
- 疑似乱数(PRNG)をセッションIDに用いることは推奨されません。
主要概念の定義
機械可読データ
このページはサイトの知識グラフ(_data/knowledge/)から自動生成されています。誤りの指摘はお問い合わせからお願いします。