私はクライアントサーバーゲームを持っています。クライアントはサーバーに接続し、ゲーム中(約5〜60分)接続を維持します。
新しいクライアントが安全に登録できるようにし、既存のクライアントがログイン資格情報が公開されることを心配せずに認証できるようにしたい。
重要なのは、パフォーマンス上の理由から、ゲームセッションではRC4のような単純で安価な暗号化を使用するのが最善ですが、対称鍵では登録手順を簡単に保護することはできません。
とにかく別のログインサーバーを保持したいので、私の考えは次のようになります。
- クライアントは、資格情報(または登録情報)を使用してHTTPS要求をログインサーバーに送信します
- ログインサーバーはユーザー情報を収集し、一時的なRC4セッション暗号化キーを生成します
- ゲームサーバーとログインサーバー間で共有される秘密対称鍵を使用したユーザー情報+RC4セッション+タイムスタンプ+ダイジェスト(両方のサーバーが時間的に同期されることを信頼できます)。
- パッケージ化されたデータ+RC4セッション暗号化キー+ゲームサーバーへのIPアドレスは、クライアントへのHTTPS要求への応答として送信されます。
- クライアントはゲームサーバーへの接続を開き、暗号化されたユーザー情報をペイロードとして含む最初の暗号化されていないhelloメッセージを送信します。
- ゲームサーバーは、(3)でパッケージ化されたデータを解凍します。これで、ユーザーと、使用することになっているRC4暗号化キーがわかります。
- タイムスタンプがログイン資格情報の有効期限が切れていることを示している場合、エラーがクライアントに返されます(クライアントは新しい情報を取得します)。復号化されたユーザーデータをダイジェストで検証できない場合は、別のエラーが返されます。
- すべてが正常にチェックされると、サーバーは暗号化されていないLOGIN_OKを送信し、RC4暗号化通信が開始されます。
考えられるセキュリティ上の懸念:
ゲームサーバーは、復号化したユーザー情報を100%信頼します。これにより、サーバーが完全に分離されます。これはすばらしいことですが、キーが危険にさらされた場合、ユーザーはユーザー情報を完全に偽造する可能性があります。これらのキーをローテーションすることで、これをいくらか軽減できるため、毎日または毎月新しいキーを使用できます。ゲームサーバーとログインサーバーの両方が、キーを管理する3番目のサーバーからこれを取得できます。次の理由から、やり過ぎかもしれません:a)サーバーにソースコードが公開されている侵入の場合、新しいキーで再起動できますb)十分なキー+暗号化により、ブルートフォース攻撃が困難になります(アルゴリズムに関する提案?)
RC4は最も安全なアルゴリズムではありませんが、最初の512バイト程度を破棄するようにしており、各キーは限られた時間、たとえば24時間のみ有効です。
私が見る限り、中間者の影響を受けにくいようです。SSLはRC4セッションキーを保護します。(5)ゲームサーバーに送信されるRC4セッションキーも暗号化されます。可能なのはDoSであり、ユーザーにキーを再度要求させることです。(2)のデータが期限切れになるまでキャッシュされている場合、これによって新しいパケットが作成されることはありません。
(3)の暗号化は、キーにランダムビットを追加することで改善できます。これらのランダムビットは暗号化されたパケットと一緒に送信され、(5)でゲームサーバーに提示されます。(6)では、ゲームサーバーはそれらのランダムなビットをキーに追加し、その結果を使用してデータを復号化します。このようにすると、攻撃者はパックされたデータがいつ変更されたかを確認できません。
ここで見落としている脆弱性はありますか?
作成されたペイロードの要約:
- クライアントのログインクレデンシャル(SSLで保護)、ログインサーバーに送信
- ユーザー情報+タイムスタンプ+一時的なゲームサーバーセッションキー+ゲームサーバーと共有される秘密キーを使用してログインサーバーによって暗号化されたダイジェスト。クライアントに渡され、変更せずにゲームサーバーに渡されます。a)クライアントが秘密鍵を知らないb)同じデータの再送信を回避するためのタイムスタンプがあるc)コンテンツが正しく暗号化されていることを確認するためのダイジェスト
- ログインサーバーからクライアントに暗号化されたペイロードとともに送信される一時的なゲームサーバーセッションキー。SSLで保護されています。
- クライアントゲームサーバーのログインパケット。ログインサーバーが受信した暗号化されたパケットで構成されます。
暗号化キーの概要:
- 一時的なゲームサーバーセッションキー:暗号化されたゲームサーバー<->クライアント通信のためにログインサーバーによってランダムに生成されます。ログインサーバーによって生成され、クライアントとゲームサーバーに渡されます。
- 秘密のユーザー情報暗号化キー。ゲームサーバーとログインサーバー間で共有され、クライアントをメッセンジャーとしてゲームサーバーにユーザー情報を渡すために使用されます。クライアントはこのキーを所有していません。