ソケットを介したマルチプレイヤーゲームの認証


11

私が取り組んでいる新しいマルチプレイヤーゲームのカスタムバイナリプロトコルを実装しています。そのターンベースの戦略ゲームなので、タイミングは本当に重要ではありません。私は現在、システムの基本的なデータ同期部分を完了しています。MMORPGゲームなどで、ユーザーのログイン/ログアウトと暗号化が通常どのように行われるのか疑問に思っていました。

  • ログイン中の安全な/秘密のパスワード送信のスキームを推奨できますか?(Diffie-Hellman鍵交換?)
  • データパケットに強力な暗号化を実装するにはどうすればよいですか?(AES 128ビット?..または、この投稿で「解読される可能性が高い暗号よりも強力な暗号化」と呼ばれるスキーム)
  • ゲームサーバーを強化して攻撃や無効なデータパケットなどを再生するのに役立つデータグラム形式のスキームはありますか?

回答:


15

回答

  • SRP -Secure Remote Password-これはDiffie-Hellmanに基づいています。これは、実際にパスワードやそれを導き出すために使用できる情報を実際に転送することなく、相互パスワードチェックを実行できるという考え方です。サーバー上でそれらをプレーンテキストで保存してはならないので、それはネットワーク上で安全ですが、パスワードハッシュしてソルトする必要があります
  • SRPの利点は、SRPが完了すると、相互にネゴシエートされた暗号化キーが提供されることです。これは、転送されたデータを前提として、攻撃者が推測することはできませんでした。つまり、ユーザーが認証されると、対称暗号化アルゴリズム(AESなど)を自由に使用できます。
  • その上に独自の信頼性のある/順序付けられた(接続指向の)実装でUDPを使用していると仮定します。UDPプレイロード全体を暗号化します-「パケットシーケンス番号」を含みます。システムが正しく設計されている場合、再生されたメッセージは自動的に拒否され、暗号化されているため、侵入者はパケットのシーケンス番号を変更できません(したがって、再生は可能ですが、自動的に無視されます)。

考え

認証は安全ですか?もちろんです。パスワードが問題になる場合は、セキュリティの面で妥協しないでください。したがって、あなたは間違いなく私の答えの最初の箇条書きを検討すべきです。

あなたのデータは安全ですか?ゲーム内購入/マイクロトランザクションの場合のみ-そして、HTTPSのように試して真実なものを使用しないでください。ゲームトラフィックを暗号化することは、次の理由から実行可能なソリューションではない可能性があります。

  • それは完全なパラノイアです。
  • (高価な)ハードウェア暗号化モジュールを購入できない限り、サーバーにCPU時間のオーバーヘッドが追加されます。
  • 有線でデータに提供するセキュリティの程度は関係ありません。暗号化されて送信される直前に、誰かがクライアントプロセスを乗っ取り、メッセージを傍受する可能性があります。これは可能性だけでなく、パケットのインターセプトと比較してコードを挿入するのがかなり簡単なので、無限に可能です。あなたがチート防止のためにこれをしているなら、あなたはあなたの時間を完全にそして完全に無駄にしています。
    • パスワードのセキュリティに関しては、残念ながら、ハイジャックされたシステムに対して合理的にできることは何もありません。クライアントは敵対的になっています。Blizzards WoWドングルはこれに対処するように設計されていますが、それがどれほど安全であるか(特に、プラグを差し込んだままにした場合)はわかりません。

チート防止のために暗号化している場合は破棄してください。あなたは不足するでしょう-あなたがそうでない場合に備えてあなたに情報を提供しました。パケットの最初のバイトと残りが暗号化されているかどうかのインジケーターでパケットを選択的に暗号化できることを覚えておいてください。ただし、クレジットカードトランザクションなどを行う必要がある場合は、HTTPSを使用します。 HTTPSは専門家によって設計されています-あなたや私が設計したものとは異なります。

そうは言っても、Blizzard は実際に WoWトラフィックを暗号化しています。これが失敗した主な理由は、おそらく完全なアマチュアである誰かが、自社製の暗号化アルゴリズムを試してみることにしたためです。これは本当にうまくいきました。業界標準のアルゴリズムを使用している場合でも、誰かがコードリバースエンジニアリングしてシミュレーションする可能性は十分にあります。クライアントがパスワードを入力しても、サポートされていないシステムが接続されていることはわかりません。


2
+1は、チート防止のためにデータパケットを暗号化しても役に立たないことを示します。OP:確認しないすべてのクライアントが要求されたアクションが可能であるならば、あなたはクライアントからの受信、実行健全性チェック、ダブルチェックをチェック武器範囲、移動速度などが、それはようにクライアントを確保する時間を無駄にしないだろう場合はハッキングを受けますあなたのゲームはそれだけの価値があります。一部のMMO企業は、クライアント/プロトコルを暗号化して難読化していますが不正行為を防止するためではなく、たとえばボット作成者が良い結果を得るのをより困難にするためです。これは、専門家の専門チームによって行われます。
ギレアデ

1
3番目の答えに関するちょっとした問題:パケットを暗号化するだけでは改ざんを防ぐのに十分ではない可能性があります。これは、多くの暗号化スキームが少なくともある程度柔軟であるためです。メッセージの整合性を保護するには、MACまたは認証された暗号化モードのいずれかが必要です
Ilmari Karonen 2012年

+1非常に完全な回答をありがとうございます。現在SRPの実装を検討しています。パスワードに使用されるハッシュ関数に関する推奨事項は何ですか?MD5?そのようなユースケースでは、OTRプロトコル(オフレコ)はどのようになりますか?SRPの代わりにauth / cryptoでうまく機能しますか?SRPを使用する場合、次の「認証済み暗号化」モードのいずれかを使用する必要がありますか?(OCB 2.0、Key Wrap、CCM、EAX、Encrypt-then-MACおよびGCM)
Robinicks

1
@JenkoはSHAファミリーのアルゴリズム(SHA1のようです)を使用しています-最近はMD5を避けるべきです。OTRは本当にあなたが見てしなければならないものではありません-不明瞭/安全になるように設計されていません(実際にはそのように誰かができるように設計し、より簡単に鍛造パケット)それはまた、インスタントメッセージングではなく、マシンの通信用に設計されています。これらのモードは必要ありません。SRPを使用するだけです。相互にネゴシエートされた対称キーを取得したら、単純に何かを暗号化できれば、正しいサードパーティと通信できることが保証されます。また、もう一度、最後の2つの段落をもう一度読んでください。
ジョナサンディキンソン

1
実際、私はさらに良い提案をします。既存のDTLS over UDP実装を使用し、独自に実装しようとしないでください。時間を節約し、独自のデータグラム暗号化レイヤーを設計しようとすると、間違いが起こりやすい小さな重要な詳細がたくさんあります。
Ilmari Karonen 2012年

2

私はジョナサンのそうでなければ優れた答えに対する私の最後のコメントはそれ自身の答えに拡張する価値があると思います:

暗号化の経験があまりない場合は、暗号化レイヤーを回避できるのであれば、暗号化レイヤーを設計しないでください。あなたがいる場合行う暗号多くの経験を持っている、あなたはそれを避けることができれば、独自の暗号化層を設計するよりもよく知っている必要があります。

代わりに、必要なことを行う、標準化され、十分にテストされた既存の暗号ライブラリを見つけてください。あなたの場合、WikipediaよるとTLS-SRP認証(RFC 5054)とDTLSによる安全なUDP通信(RFC 6347)の両方を提供するGnuTLSをお勧めします。前者はログインを処理し、後者は盗聴とアクティブな攻撃の両方からこのように形成された安全なチャネルを保護し、リプレイ攻撃から保護することさえできます


TCPを使用しています。これは特定のクライアントにとって非常に異なる種類のゲームです。ギャンブル/賭けと同様に、プロセスを乗っ取るために使用できるすべての情報は、家による不要な損失の可能性を高めます。この場合、情報はお金になるため、データを非常に安全に保つ必要があります。
Robinicks 2012年

TCPを使用している場合はさらに簡単です。DTLSの代わりに通常のTLS 1.2を使用できるため、より多くのオプションを選択できます。ただし、GnuTLSライブラリは引き続きお勧めします。
Ilmari Karonen

少し調査して、クライアント側とサーバー側の両方でTLSソースコードを参照できるかどうかを確認し、プロトコルがその機能に基づいていることを確認します。これで十分でしょうか?基本的に、暗号/モードを使用したパケット暗号化だけですよね?
Robinicks

いいえ、TLSプロトコルにはそれだけではありません。そのため、独自のライブラリをロールするのではなく、それを実装する標準ライブラリを使用する必要があります。
Ilmari Karonen
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.