暗号学的乱数を生成することは「安全なトークン・鍵・識別子を作るための最重要基盤」です
読者のみなさんが業務システムを開発する際、 暗号学的に安全な乱数(Cryptographically Secure Random Number)を生成することは必須のセキュリティ要件です。
この乱数は次のような場面で使われます。
- パスワードリセット用トークン
- API アクセストークン
- セッション ID
- CSRF トークン
- 暗号鍵(AES、RSA など)
- ランダムな初期化ベクトル(IV)
これらはすべて「推測されてはいけない」ため、 暗号学的に安全な乱数生成器を使う必要があります。
ここでは、初心者でも理解できるように、 実務で使える C# の暗号学的乱数生成ユーティリティを丁寧に解説します。
なぜ“暗号学的乱数”が必要なのか?
Random クラスは絶対に使ってはいけません
初心者がやりがちな誤り:
var rnd = new Random();
int value = rnd.Next();
C#これは セキュリティ用途では完全に不適切 です。
理由:
- 予測可能
- シード値が弱い
- 総当たり攻撃に弱い
- トークンや鍵として使うと破られる
攻撃者は Random の生成パターンを簡単に推測できます。
暗号学的乱数とは?
- 予測不能
- 再現不可能
- 攻撃者が次の値を推測できない
C# ではこれを生成するために RandomNumberGenerator を使います。
暗号学的乱数を生成するための正しい API を理解する
C# の正しい乱数生成器:
- RandomNumberGenerator.GetBytes()
- RandomNumberGenerator.Fill()
これらは OS の暗号モジュールを利用し、 安全な乱数を生成します。

