サーバーの作成時にログインとゲームのロジックを分割する方法は?


9

私はポーカーのようなゲームサーバーを構築しています。すべてのログインとゲームロジックを1つのサーバーで処理する予定でしたが、Webでの調査から、これはスケーリングされないことがわかり、分割することは理にかなっています。ログインおよびゲームサーバーへの作業。しかし、ログインサーバーで認証を処理し、クライアントにゲームサーバーへの新しい接続を確立させた後、どのクライアントがどれであるかをどのようにして知ることができませんか?再度ログインする必要がなく、ログイン用のサーバーを用意する目的を無効にする必要はありませんか?知らないプロセスやマシンに接続を渡す方法はありますか?ネットワーキングについての私の小さな知識を失礼します。


4
YAGNI:あなたはそれを必要としないでしょう。時期尚早の最適化を実装しないでください。ログインはゲームの非常に些細な部分のように聞こえますが、分割してもメリットはほとんどありません。ゲームに十分な数のユーザーが含まれるようになると(1台のサーバーで数千人のユーザーをサポートでき、他のユーザーは冗長性のためだけにサポートできるはずです)、この種のことを理解しているソフトウェアエンジニアを雇うことができます。
MarkR 2013

あなたは誤解を招く答えを受け入れました、あなたはそれを注意深く再考するべきです、そうしないとあなたは頭の中で間違った概念に陥り、コードに誤った安心感をもたらすことになります。
o0 '。

ゲームサーバーとログインサーバーの間に特別な接続が必要ないため、Kylotanの回答が気に入りました。また、秘密鍵の侵害はすべてのアカウントでの侵害であり、貨物輸送であるというPhilipの指摘もわかります。両方のログインバージョンを実装し、コードが監査されたときにセキュリティの専門家に問い合わせます。私の質問はかなり基本的なもののようで、誰もが同意する標準的な解決策になると思っていました。図を行きます。セキュリティの専門家だけがこの議論に参加して決定を下せるかどうか。
user342580 2013

厳密に言えば、サーバー間でログイントークンを渡す方がより安全です。これを行うための安全なチャネルがあればです。また、実装が難しくなり、誤解するリスクが高まります。ハッシュベースのメッセージ認証システムは、誰かがあなたの秘密鍵を手に入れることができない限り完全に安全でなければなりません-そして彼らがあなたの内部システムへのアクセスを介してあなたの鍵を手に入れることができるなら、あなたはログインを送ることによって修正されない問題を抱えていますトークンを手動で。
カイロタン2013

回答:


3

Philippの答え​​は完璧ですが、ログインサーバーとゲームサーバー間の接続を必要としないわずかに異なる方法があり、そのような接続が困難な場合に役立ちます。

  1. ユーザーがログインサーバーで正常に認証されると、上記のようにゲームサーバーのアドレスとログイントークンが送信されます。ただし、このトークンは2つの部分で構成されています。ログインサーバーの時刻、その番号のハッシュ、ユーザー名、IPアドレス、ゲームサーバーのIPアドレスまたはID、およびあなただけが知っている秘密鍵です。
  2. クライアントは、このトークンを送信して、提供されたゲームサーバーへのログインを試みます。サーバーは、ログイントークンの情報と独自のIPアドレス/ IDおよび秘密鍵に基づいて、以前と同じハッシュを形成します。このハッシュがトークン内のハッシュと一致する場合、プレーヤーが正しく認証されていることがわかります。次に、日付が古すぎないことを確認します(例:1分以上)。

これは機能します:

  • 有効期限が切れるため、コピーして再利用することはできません。
  • 秘密鍵を知らなければ、新たなログインなしでは構築できません。
  • 元のIPアドレスがそれを構成するために使用されるため、他の誰か(たとえば、パケットスニファ)によって簡単に傍受されて使用されることはありません。
  • ユーザー名がハッシュの一部を形成しているため、別のアカウントには使用できません。
  • サーバーのID / IPアドレスがハッシュの一部を形成するため、異なるゲームサーバーでの同時ログインには使用できません。

より簡単に言えば、ハッシュは送信者がログイントークンを偽造することをほぼ不可能にし、トークン内の情報を信頼できるようにします。

他のセキュリティ指向のハッシュと同様に、bcrypt、PBKDF2、およびscryptが好きなように思える現時点で入手可能な最高のハッシュ関数を使用し、ブルートフォースの再現をあまり実用的でないように、秘密鍵が非常に長くなるようにします。


非常に賢い、私はこの解決策を好む。私の質問は秘密鍵です。パスフレーズのようなものでしょうか?また、ユーザーごとに異なる必要がありますか?
user342580 2013

これは機能しないか、実際には@Philippの答え​​の非表示の再実装です。ログインサーバーとゲームサーバーの両方が同じ秘密鍵を知っていると想定しているため、失敗します。両方が鍵を知っている場合は、一方を他方に連絡して提供する必要があります。または、両方に送信するにはサードパーティが必要です。いずれにせよ、以前と同じように嗅ぐことができます。
o0 '。

@Lohoris、アイデアは、ログインとゲームサーバーの両方を所有し、秘密鍵を提供できるということです。両方のサーバーを所有していない場合、ゲームサーバーはどうやってログインサーバーの認証を信頼できますか?
カイロタン2013

@ user342580:ある種の長いフレーズを使用します。ユーザーごとに異なる必要はありませんが、異なる場合でも問題はありません。暗号ハッシュ関数が十分強力であり、定期的に変更する限り、それは重要ではありません。
カイロタン2013

@Kylotan正確に、どのようにキーを提供しますか?サーバーからサーバーへの接続よりも、サーバーからサーバーへの接続の方が安全であると考えるのはなぜですか?
o0 '。

8
  1. ユーザーがログインサーバーに対して自分自身を認証した後、トークン(ランダムに生成された一意の文字列は長すぎて推測できない)を与えます。

  2. ログインサーバーはゲームサーバーを選択します。トークン、ユーザー名、およびユーザーに関するその他すべての関連データを、loginserverから選択したサーバーに送信します。

  3. トークンとゲームサーバーのホスト名をクライアントに送信します。次に、ログインサーバーから切断します。

  4. 次に、クライアントはユーザー名とトークンを使用してゲームサーバーに接続します。

  5. クライアントからのトークンがloginserverによって報告されたばかりのトークンと一致する場合、それを受け入れます。

これを安全にするために、トークンは暗号化された安全な乱数ジェネレータから作成する必要があります。各トークンはゲームサーバーによって一度だけ受け入れられ、数分後に未使用のトークンは破棄されます。


では、bcryptを使用すれば十分でしょうか?bcryptを使用して、time + username + passwordのハッシュからトークンを作成することを考えています。
user342580 2013

そうだと思います。パスワードがわかればトークンを推測できますが、パスワードがわかれば、通常の方法でログインできます。
フィリップ

1
bcryptは、入力が適切にランダムで取得不可である限り機能します。時間のみを使用する場合、攻撃者は時間を予測し、bcryptを実行してトークンを取得できます。時間と安全なランダマイザー(UNIX / Linuxシステムの/ dev / randomなど)では、必ず秘密のソルトを使用してください。
Sean Middleditch、2013

パスワードは別のサイトで侵害された可能性があるため、適切な秘密であるとは想定しません。
Sean Middleditch、2013

1
@SeanMiddleditchパスワードが危険にさらされると、とにかくすべてのセキュリティが失われます。パスワードを入手した攻撃者は、通常の方法でログインするだけでトークンを取得できるため、トークンを推測する理由はありません。
フィリップ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.