テック情報一覧に戻る
security
2026-01-14 公開
2026-01-15 更新
読了目安: 約3

乱数の深淵:Math.random()をセキュリティに使ってはいけない本当の理由

カジノから暗号まで、世界を支える「乱数」。コンピュータが作る「偽の乱数」の限界と、暗号学的に安全な生成方法(CSPRNG)を徹底解説。

コンピュータは「本物のサイコロ」を振れない

プログラミングで頻繁に使う Math.random() は、実は数式に基づいた「擬似乱数」です。種(シード)が同じなら予測が可能であり、これはセキュリティ上、致命的な弱点となります。

乱数の欠陥による悲劇

過去には、オンラインカジノのシャッフルが予測されたり、不適切な乱数によって暗号キーが推測されたりする事件が数多く起きています。「一見バラバラ」と「予測不可能」は全く別物です。

暗号学的に安全な乱数(CSPRNG)

セキュリティが関わる場面では、CSPRNGを使用しなければなりません。これらはマウスの動きやCPUの温度変化などの「予測不能なノイズ」をソースにしています。

主要な実装方法
  • ブラウザwindow.crypto.getRandomValues()
  • Node.jscrypto.randomBytes()
  • Linux/dev/urandom
「たかが乱数」と侮るなかれ。それはデジタルの城壁の要石である。

「モジュロ・バイアス」の罠

安全な乱数を使っても、% 10 のように範囲を絞る際にわずかな「偏り」が生じることがあります。これを「モジュロ・バイアス」と呼び、解析のヒントを与えてしまいます。範囲指定には信頼できる手法を使いましょう。

当サイトのランダム文字列生成ツールは、安全なCrypto APIをベースに設計されています。深淵なる乱数の世界を理解し、アプリの安全性をプロレベルに引き上げましょう。

パソコン博士
パソコン博士の独り言

「0.1234...」といった小数の乱数を作るのと、安全なパスワードを作るのとでは、裏側の仕組みが全く違うのじゃ。テスト用のデータなら Math.random() で十分じゃが、セキュリティが絡むときは必ず「Crypto」という言葉がついた関数を探スノじゃぞ。これはエンジニアとしての「命を守る作法」のようなものじゃな!

あわせて読みたい記事