コンピュータは「本物のサイコロ」を振れない
プログラミングで頻繁に使う Math.random() は、実は数式に基づいた「擬似乱数」です。種(シード)が同じなら予測が可能であり、これはセキュリティ上、致命的な弱点となります。
乱数の欠陥による悲劇
過去には、オンラインカジノのシャッフルが予測されたり、不適切な乱数によって暗号キーが推測されたりする事件が数多く起きています。「一見バラバラ」と「予測不可能」は全く別物です。
暗号学的に安全な乱数(CSPRNG)
セキュリティが関わる場面では、CSPRNGを使用しなければなりません。これらはマウスの動きやCPUの温度変化などの「予測不能なノイズ」をソースにしています。
主要な実装方法
「たかが乱数」と侮るなかれ。それはデジタルの城壁の要石である。
- ブラウザ —
window.crypto.getRandomValues() - Node.js —
crypto.randomBytes() - Linux —
/dev/urandom
「モジュロ・バイアス」の罠
安全な乱数を使っても、% 10 のように範囲を絞る際にわずかな「偏り」が生じることがあります。これを「モジュロ・バイアス」と呼び、解析のヒントを与えてしまいます。範囲指定には信頼できる手法を使いましょう。
当サイトのランダム文字列生成ツールは、安全なCrypto APIをベースに設計されています。深淵なる乱数の世界を理解し、アプリの安全性をプロレベルに引き上げましょう。
「0.1234...」といった小数の乱数を作るのと、安全なパスワードを作るのとでは、裏側の仕組みが全く違うのじゃ。テスト用のデータなら
Math.random()で十分じゃが、セキュリティが絡むときは必ず「Crypto」という言葉がついた関数を探スノじゃぞ。これはエンジニアとしての「命を守る作法」のようなものじゃな!