背景
最近、私のゲームにランダム性を追加する問題を解決する必要がありました。
もちろんです!ランダム性はゲームにとって非常に重要で、それがゲームを面白くします。これが日本のガチャやパチンコが盛んな理由です :)))。
また、クライアントリクエストに対してサーバーへの秘密キーを生成する必要がある時もあります。🔐
したがって、私のゲームや他のアプリケーション間で共有できるサービスを作成する必要があり、高いトラフィックと良好なセキュリティを保証する必要があります。(難しい 🥲)
コンピュータは本当にランダムな数を生成できるのか?
コンピュータが本当にランダムな数を生成できるのか、いつも疑問に思っています。それは0と1のビットに基づいて動作し、出力を生成するための入力が必要です。実際、多くのランダム数生成アルゴリズムはコンピュータの時計と複雑な計算に基づいて生成されます。理論的には、パターンを予測することができます。
実際には、JS/V8のランダムアルゴリズムを予測した記事もあります:
ハッカーがあなたのランダム秘密キー生成規則を把握できたら、それは非常に恐ろしいことです。
ですから、私たちはコンピュータのライフサイクルの外にある何か、非常に日常的でランダムなものが必要です ^^。
解決策
私の基準を満たすためのアルゴリズムを作成するには、次の要素が必要です:
- 予測困難:生成されたすべての値を知っていても、前の値に基づいて次の値を予測することはできません。
- 均一性:生成される数は均等に分布する必要があり、つまり、各数は同じ出現確率を持つ必要があります。
- 再現不可能:アルゴリズムの動作方法に関する情報があっても、ランダム数列を再現することはできません。
要件
私はランダム数生成アルゴリズム(CSRNGs)の入力を次のように決定しました:
- システムからのエントロピー:MachineTimeやRequestIDなど、サーバーのみが知っている情報。
- 環境からのエントロピー:サーバー周辺の環境ノイズ、動物や街の景色の画像など。
- ランダムシード:CSRNGsは通常、乱数生成プロセスを開始するために使用されるランダムな「シード」から開始します。このシードは、生成された数列が予測不可能であることを保証するために、十分にランダムである必要があります。
- 定期的なエントロピーの収集:ランダム性を維持するために、CSRNGsは定期的にシステムから追加のエントロピーを収集し、その状態を更新することができます。
- 複数のエントロピー源の組み合わせ:一部のCSRNGsは、複数のエントロピー源を使用し、それらを組み合わせて出力を生成し、複雑さを増し、予測可能性を低減します。
実行
上記の各項目から代表を選びます。
- 私はサーバーのマシン時間とクライアントのrequestIDを選びました。クライアントがランダム数をリクエストするために送信すると、ユーザーのrequestIDを増やし、現在のサーバー時間をシードとして使用します。
- 私はカメラを使って写真を撮ることにしました。画像データを取得したら、SHA256でハッシュ化してハッシュ文字列(64文字)を生成します。
予算が限られているので、あるものでやりくりします。20匹ほどの大小さまざまな魚がいる魚の水槽があり🐳、彼らは絶えず泳いでいるので、同じ写真を2回撮る可能性はほぼゼロです(微小な光の変化が1ピクセルの色を変えるだけで、ハッシュ文字列を完全に変えるには十分です)。🌝
さらに、水槽のライトを一晩中つけていると電気代のことで妻に怒られるので、プラズマボールを後ろに置きました。この球体は非常に活動的で予測不可能なので、このケースには最適です。へへ。⚡
- もちろん、1と2からランダムなシードを合成し、通常の乱数生成アルゴリズムを使用します。
- 私の古いカメラは30fpsです。📸 つまり、1秒に30回撮影すると、1秒に30回自動的かつ公正に乱数生成アルゴリズムを更新することになります。わお。でも、1FPSだけあれば十分だと思います。誰が私のささやかなサーバーをハックするために手間をかけると思いますか?🔥
- これで私には十分だと思います。まとめると、次のようになります:1秒ごとに写真を撮影 → それをハッシュ化して64文字の文字列を得る → リクエストごとにそのコード + requestIDとサーバー時間(セキュリティが必要な場合)をシードとして使用し、通常の乱数生成アルゴリズムを使用します。
結果の評価
なかなか良いです👍🏻。ここに座ってデモをコーディングしているので、このブログですぐに試すことができます。😭
基本的に、撮影された各画像には、多少の光の違いがあります。カメラを天井に向けると、コードは正常に生成されます。
しかし、カメラをテーブルに向けて、見えるものがすべて真っ暗になると、撮影した写真はすべて同じコードになります。
基本的に、予測や再現は非常に困難です。スーパーコンピュータが私の家の魚たちの次の1秒の位置や姿勢をハックしなければなりません。🦈
均一性に関しては、ハッシュ文字列から1~10の範囲の数値に変換する結果をテストし、かなり安定していることがわかりました。
全体的には満足しており、これから私のゲームやサーバーに適用します。ゲーマーは公正でクリーンな環境で遊ぶことができ、嫌いな人を除いて結果を操作することはありません。😈