【あんごうがくてきにあんぜんなぎじらんすうせいせいき】

暗号学的に安全な擬似乱数生成器(CSPRNG) とは?

公開:
💡 秘密の番号を作る、先読みされにくい抽選機

出力の一部を知られても、ほかの値を計算で予測することが難しいように設計された擬似乱数生成器。適切な初期化と内部状態の保護を前提に、鍵や認証トークンなどの生成を支えます。

📌 このページのポイント
秘密の値には「予測されにくさ」 良質な 乱雑さ CSPRNG •••••• 秘密の トークン 初期化と内部状態の保護が前提 短すぎる値・生成後の漏洩には別の対策 例:4桁の数字は、候補が1万通り
良質な乱雑さで初期化し、内部状態を保護して予測困難な値を生成します。トークンの長さと生成後の秘密の管理も必要です。
ひよこ ひよこ
ランダムな数なら、秘密の番号に使っていいの?
ペンギン先生 ペンギン先生
見た目がばらばらでも、前の出力から次を読める方式があるんだ。CSPRNGは、一部の出力を見られてもほかの値を計算で予測しにくいように設計した仕組みだよ。良質な乱雑さで初期状態を設定することと、内部状態の保護が前提になるんだ。
ひよこ ひよこ
どんなときに使うの?
ペンギン先生 ペンギン先生
パスワード再設定用の秘密の文字列など、当てられると困る値を作るときだね。Pythonならsecretsを使えるよ。標準のrandomの既定の方式はシミュレーション向けで、秘密を作る用途には適さないんだ。
ひよこ ひよこ
暗号用なら、4桁の番号でも安心なの?
ペンギン先生 ペンギン先生
そうとはいえないよ。0000から9999までなら候補は1万通りしかない。各番号が同じ確率で出るとしても、1回で当たる確率は1万分の1だね。予測困難な方式を選ぶことと、十分な長さを確保することは別なんだ。
ひよこ ひよこ
作ったあとに番号が盗まれたら?
ペンギン先生 ペンギン先生
CSPRNGは生成する仕組みなので、漏れた秘密を守り直すことはできないよ。内部状態も生成した秘密の文字列も保護が必要なんだ。「暗号用」はアプリ全体の安全を保証する言葉ではないんだね。
もっと詳しく知りたい人へ

ブラウザで乱数を取るAPIと、暗号鍵を作るAPIは同じ?

用途を分けます。Web CryptoのgetRandomValuesは整数型の配列へ暗号学的に強い乱数を書き込みますが、暗号鍵の生成には仕様が案内するsubtle.generateKeyを使います。鍵のアルゴリズムや用途も指定する必要があり、乱数の配列を作るだけでは同じ処理になりません。

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「CSPRNG」って出てきたら「秘密の値を作るための、先読みされにくい乱数の仕組み」と思えればだいたいOK!
📖 おまけ:英語の意味
「Cryptographically Secure Pseudorandom Number Generator」 = 暗号学的に安全な擬似乱数生成器
💬 Pseudorandomは計算で作る擬似乱数、Cryptographically Secureは暗号用途に必要な予測困難性を表す言葉だよ

参考資料

← 用語集にもどる