コンテンツへスキップ
uencoder

暗号学的に安全な擬似乱数生成器を使う

CSPRNG は真の乱数と区別がつかない出力を生成します。正しい API と、セキュリティ文脈で Math.random() が禁止される理由を学びましょう。

  1. 1

    CSPRNG はハードウェアソース(熱ノイズ、キーストロークのタイミング、ディスクシーク時間)からエントロピーを集め、真の乱数と計算上区別できない出力を生成します。ブラウザーでは crypto.getRandomValues() を、Node.js では crypto.randomBytes() を使ってください。Math.random() は決して使わないでください。シミュレーション向けの PRNG であり、セキュリティ向けではありません。

  2. 2
    ランダムバイトジェネレーター →

    暗号学的に安全なランダムバイトを生成します。このツールはプラットフォームの CSPRNG を使います。必要なバイト数を指定してください(256 ビット鍵には 32、128 ビット鍵には 16、GCM nonce には 12)。

  3. 3
    パスワードジェネレーター →

    CSPRNG でランダムパスワードを生成します。長さと文字セットを指定してください。高セキュリティのパスワードには、大文字小文字、数字、記号を含む 16 文字以上を使ってください。

  4. 4

    エントロピーの確認:CSPRNG の良さはエントロピー源で決まります。起動時、OS のエントロピープールは少ないことがあります。Node.js とブラウザーは、十分なエントロピーが集まるまでブロックすることで対処します。組み込みデバイスや VM では、ハードウェアのエントロピー源(例:RDRAND、/dev/hwrng)の追加を検討してください。

よくある質問

Math.random() はなぜ安全でないのですか?
Math.random() は、予測可能な値をシードとした決定論的アルゴリズム(例:xorshift)を使います。十分な出力があれば、攻撃者は内部状態を再構築し、将来のすべての出力を予測できます。シミュレーションでの速度のために設計されており、セキュリティのための予測不可能性はありません。
エントロピーとは何ですか?
エントロピーは予測不可能性の尺度です。CSPRNG が安全な出力を生成するには、高エントロピーの入力(ハードウェアノイズから)が必要です。作成直後の VM ではエントロピープールが小さいことがあります。haveged や virtio-rng で補ってください。低エントロピーは予測可能な「ランダム」出力につながります。

関連ツール