ツール一覧に戻る

暗号学的擬似乱数生成器(CSPRNG) 乱数生成ツール

CSPRNG(暗号学的擬似乱数生成器)を使い、整数・小数・検証コード・トークンをブラウザ内で生成します。範囲指定、重複なし、random number generator用途、乱数メーカー用途をひとつの画面で扱えます。

今すぐ生成する 生成はブラウザ内で完結 Math.random()不使用 偏りを避ける抽選方式
暗号学的擬似乱数生成器を表す盾と光る乱数粒子のアイコン
random-number CSPRNG

84, 17, 39, 6, 100

9f4c6d2a0b1e77c9

vxy8mKzS_5qD1dAF

生成結果

未生成

設定を選んで「生成する」を押してください。

HOW TO USE

ツールの使い方

このCSPRNG乱数生成ツールは、普通のrandom number generatorとして使える操作感を保ちながら、暗号学的擬似乱数生成器を使う場面で迷いやすい設定を一画面にまとめています。まず用途でタブを選び、範囲や形式を決め、必要な出力形式でコピーします。

1. モードを選ぶ

整数、小数、コード・トークンの3タブから選びます。抽選や番号割り当ては整数、計算用の乱数は小数、検証コードやBase64URLトークンはコード・トークンを使います。

2. 範囲と個数を決める

整数では最小値・最大値・生成個数・重複なしを設定できます。小数では小数桁を指定できます。コード・トークンでは数字コード、HEX、Base64URL、Base64、UUID v4を切り替えます。

3. 出力形式を選んでコピーする

行区切り、CSV、JSONで出力できます。行区切りでは区切り文字に\nや\tを指定できるので、表計算ソフトやログ、テストデータへそのまま貼りやすくしています。

CONFIGURATION RANGE

設定可能幅

上限はセキュリティではなく、ブラウザ上で実用的に動かすための幅です。大量生成や厳密な鍵管理が必要な場合は、サーバー側の設計、レート制限、保存、失効、監査ログまで含めて扱ってください。

整数

  • 最小値・最大値は整数で指定。カンマ入り入力も受け付けます。
  • 生成個数は1〜1000件。重複なしは範囲内の値数を超えると警告します。
  • 重複なしの実用上限は100,000通り。巨大な候補集合で端末を固めないための制限です。
  • 並び順は生成順、昇順、降順から選べます。

小数

  • 最小値・最大値は有限の数値で指定します。
  • 生成個数は1〜1000件。小数桁は0〜12桁です。
  • 内部では指定桁にスケールした整数をCSPRNGで作り、最後に小数へ戻します。
  • 並び順は生成順、昇順、降順から選べます。

コード・トークン

  • 形式は数字コード、HEX、Base64URL、Base64、UUID v4。
  • バイト長は1〜4096バイト。数字コードの桁数は1〜256桁です。
  • 生成個数は1〜1000件。UUID v4ではバイト長ではなく仕様の36文字形式で出力します。
  • getRandomValues()の65,536バイト制限を超えないよう内部で分割し、画面操作では応答性を優先して上限を置いています。

CSPRNG GUIDE

CSPRNG乱数生成ツールを土台から本格理解する

乱数は、見た目が散っていればよい場面と、予測されると困る場面で求められる品質が変わります。この解説では、サイコロの直感からCSPRNG、暗号学的擬似乱数生成器、rejection samplingまでをひと続きで説明します。

1

乱数には二つの顔がある

乱数には、二つの顔があります。ひとつは、見た目がちゃんと散っている乱数です。サイコロを何度も振ったとき、1だけがやたら多く出たら変です。コイン投げなら、表と裏が極端に偏ると気になります。抽選、順番決め、ちょっとしたシミュレーションなら、まず気にするのはこの「偏りのなさ」です。

もうひとつは、相手に見られても読まれない乱数です。ログイン用の一時コード、パスワード再設定トークン、APIで使う秘密値、セッションIDのようなものでは、「あとで見たら分布がきれい」だけでは足りません。攻撃者がいくつかの値を見ても次の値を当てられないこと、過去や未来の値を逆算できないこと、内部状態を推測できないことが必要になります。ここで必要になるのがCSPRNG、Cryptographically Secure Pseudorandom Number Generator、暗号学的擬似乱数生成器です。

OWASPは、セッションIDや安全上重要なランダム値では通常のPRNGではなくCSPRNGを使うべきだと説明しています。つまり、乱数生成ツールや乱数メーカーと呼ばれるものでも、用途が認証や権限に近づいた瞬間、必要な品質が一段変わります。

2

「擬似」なのになぜ安全と言えるのか

ここで少し不思議なことが起きます。「擬似」なのに、なぜ安全と言えるのでしょうか。コンピュータの乱数は、多くの場合、完全な自然現象そのものを毎回その場で読んでいるわけではありません。最初にOSなどから得た予測しにくい材料、つまりエントロピーを使って内部状態を作り、その状態を暗号学的な処理で混ぜながら、次々にビット列を出します。

状態が同じなら出力も同じになるので、数学的には決定論的です。それでも、外から見た攻撃者に内部状態が分からず、出力から次の出力を計算できないように作られていれば、実用上は「読めない乱数」として扱えます。NIST SP 800-90A Rev.1は、このようなDRBG、決定論的乱数ビット生成器の代表的な仕組みを扱います。さらに90Bはエントロピー源、90CはDRBGとエントロピー源を組み合わせたRBG構成を扱い、乱数を「作る」だけでなく「支える材料」まで分けて考えます。

3

このツールはブラウザのCSPRNG相当の乱数源を利用する

このツールは、乱数生成アルゴリズムを自前で発明しているわけではありません。そこはブラウザとOSに任せます。具体的には、Web Crypto APIのcrypto.getRandomValues()で暗号学的に強いランダムバイトを取得し、UUID v4が必要なときはcrypto.randomUUID()を使います。

より正確に言うと、このツールが単独でCSPRNGそのものなのではなく、ブラウザが提供するCSPRNG相当の乱数源を利用するツールです。実際のアルゴリズムやエントロピー源はブラウザ、OS、実装に依存します。Web Cryptography仕様も、エントロピー源の情報理論的な下限を一律には決めず、実装が高品質なエントロピーでseedされた確立済みのPRNGを使うべきだとしています。

getRandomValues()には、一度に65,536バイトを超えるTypedArrayへは使えないという制限があります。このツールは内部で分割して呼び出します。randomUUID()は通常HTTPSなどのsecure contextで利用されます。getRandomValues()は例外的に非secure contextでも利用できるAPIですが、乱数生成ツール自体はページ改ざんを避ける意味でもHTTPS提供を前提に考えるべきです。

4

Math.random()ではなぜだめなのか

では、Math.random()ではなぜだめなのでしょうか。理由は単純で、Math.random()は便利な疑似乱数であって、暗号用途の安全性を目的にしていないからです。画面上の演出、ゲーム内のちょっとした揺らぎ、簡単な並び替えなら十分な場面があります。

しかし、秘密値や認証に関わる値では、攻撃者が次を当てにくいことが必要です。MDNもMath.random()をセキュリティ関連に使わず、Web Crypto API、より具体的にはcrypto.getRandomValues()を使うよう説明しています。ここが最初の分かれ道です。見た目のランダムさと、攻撃者に読まれないランダムさは、同じ顔をしていても別物です。

5

範囲指定で本当に怖いのは、目に見えない偏り

ただし、Web Crypto APIを使えばすべて終わり、ではありません。ここからが本当に大事です。たとえば、0から255まで均等に出る1バイトの乱数があるとします。これを1〜100の整数にしたいとき、単純に100で割った余りを使うとどうなるでしょうか。

256個の値を100個の箱に配ることになります。100で割り切れないので、ある箱には3個、ある箱には2個しか入りません。具体的には、0〜55に対応する値は3通り、56〜99に対応する値は2通りになります。つまり、前半の値が後半より1.5倍出やすくなります。これがmodulo biasです。

乱数そのものが強くても、最後に範囲へ押し込む変換が雑だと、出口で曲がってしまいます。強い水源からきれいな水を引いてきたのに、蛇口の先で片側だけ漏れているようなものです。

この偏りを避けるために使うのがrejection samplingです。考え方は拍子抜けするほど素朴です。範囲にきれいに割り当てられる部分だけを採用し、余った部分は捨てて引き直します。0〜255から1〜100を作るなら、0〜199までを使えば100個の値にちょうど2個ずつ対応します。200〜255が出たら採用せず、もう一度引きます。

捨てるのはもったいなく見えますが、公平さを買うための必要経費です。CSPRNGの強さを最後の整数変換まで保つには、この一手が効きます。

6

HEX、Base64URL、UUID v4は同じ意味ではない

文字列として乱数を出すときにも、形式ごとの意味を知っておくと迷いません。HEXは1文字で4ビットを表すので、16バイト、つまり128ビットの乱数は32文字になります。読みやすく、ログや設定ファイルに貼りやすい一方、少し長くなります。

Base64は1文字で6ビットを運べるので短くできますが、通常のBase64には+や/や=が出ます。URLやAPIで扱いやすくするなら、+を-、/を_に変えたBase64URLが便利です。RFC 4648は、通常のBase64とURL・ファイル名安全なBase64URLを区別して定義しています。

UUID v4は、識別子として広く使われる形式です。crypto.randomUUID()で作れるUUID v4は、バージョンやvariantを示す固定ビットを除き、122ビット分がランダムです。これは衝突しにくい識別子としては非常に便利です。ただし、UUIDはIDであって、何にでも使える秘密の鍵ではありません。RFC 9562も、UUIDを持っているだけでアクセス権になるようなsecurity capabilityとして使うべきではないと注意しています。

7

token、検証コード、salt、nonceを同じ条件で語らない

トークンは、推測されにくいことが中心です。パスワードリセットURLやAPIアクセス用の一時値のように、それを知っていることが権限につながるなら、十分なエントロピー、有効期限、保存方法、失効処理が必要です。

検証コードは、短い桁数で人間が入力しやすくするため、単体ではそこまで強くありません。6桁の数字なら候補は100万通り、約20ビットです。CSPRNGで均等に作ることは大切ですが、それだけでは足りません。短時間で失効させる、試行回数を制限する、同じ相手に大量送信させない、といった運用側の守りがセットになります。

saltは、多くの場合、秘密である必要はありません。大事なのは、同じパスワードが同じハッシュに見えないようにすること、そして利用者や保存対象ごとに重複しにくいことです。CSPRNGで作るのはよい選択ですが、「saltが読まれたら終わり」という種類の値ではありません。

nonceは、名前の通り一度だけ使う値です。暗号モードによっては、予測困難性よりも同じ鍵の下で絶対に再利用しないことが決定的に重要です。ランダムnonceを使う場合でも、サイズが小さすぎれば衝突します。カウンタで管理する方が向く場面もあります。OWASPも、IVやnonceは暗号モードに応じてライブラリで扱うべき要素として説明しています。

8

暗号鍵と重複なし抽選には別の限界がある

暗号鍵については、さらに慎重に考えます。このツールでランダムなバイト列を作ること自体はできます。しかし、暗号鍵はランダムな文字列をコピーしてどこかに貼るだけで安全になるものではありません。アルゴリズム、用途、取り出し可能かどうか、保存、ローテーション、破棄まで含めて管理する必要があります。Web Crypto APIでも、鍵生成にはgetRandomValues()ではなくgenerateKey()を使うことが推奨されています。

重複なしの抽選では、さらに別の限界があります。1〜10から重複なしで11個選ぶことはできません。これは実装の問題ではなく、数学的に不可能です。このツールでは、そのような条件を静かに通さず、警告します。また、極端に広い範囲で大量の重複なし生成をすると、端末のメモリや処理時間を大きく使うため、実用上の上限も必要です。便利な乱数メーカーである前に、破綻した条件を破綻として扱うことが大切です。

9

乱数は入口より出口で失敗しが

このツールが守るべきことははっきりしています。Math.random()ではなくWeb Crypto APIを使う。範囲指定の整数では、単純な剰余ではなくrejection samplingで偏りを避ける。HEX、Base64URL、UUID v4の違いを説明し、用途に合った形式を選べるようにする。UUID v4を便利な識別子として扱い、万能な秘密トークンと誤解させない。salt、nonce、検証コード、tokenの安全条件を分けて説明する。重複なし生成で不可能な条件を警告する。暗号鍵そのものは、Web Crypto APIのgenerateKey()など用途別APIを推奨する。

最後に、乱数生成ツールのいちばん大事なオチを置いておきます。安全な乱数は、「強いAPIを呼んだ」という一点だけでは決まりません。強い乱数源を使う。範囲変換で偏らせない。短いコードには試行制限を付ける。nonceは再利用しない。UUIDを秘密値だと思い込まない。鍵は鍵として管理する。

乱数は、入口より出口で失敗しがちです。CSPRNGを使う意味は、乱数の水源を強くすることだけではありません。その水を、最後の一滴まで曲げずに届けることです。

乱数生成ツールとしてどこまで任せるか

このページは、暗号学の教材ではなく実用の乱数生成ツールです。ただし、生成方式の根拠を隠さず、日常的な抽選から開発時のトークン作成まで、どの用途なら任せてよいかが判断できるようにしています。

抽選・番号割り当て

1〜100、0〜100、重複なしなど、検索されやすい乱数メーカー用途を素早く設定できます。

検証コード・仮ID

数字コードやHEXを生成し、フォーム検証、QA、テストデータ作成に使えます。

トークン・salt・nonce

Base64URLやバイト長プリセットで、開発時に必要なランダム値を作れます。暗号鍵そのものは専用APIに任せる、という線引きも明確にしています。