3

個人的な MMO ゲーム プロジェクトでは、自作の信頼性の高い UDP ベースのプロトコルを Java で実装しています。私の現在の設定を考えると、スヌーパーがセッションをハイジャックするのは比較的簡単だと思うので、これを防ぐために、少し暗号学を学ぶ機会を得ています. とても興味深いです。

Diffie-Hellman 鍵交換(非常に巧妙な概念)を使用して、クライアントとサーバーの間で共有秘密鍵を正常に作成できますが、今度はこれを使用してパケットの信頼性を保証する必要があります。これまでの予備テストでは、私が試したいくつかの異なる暗号によってデータ量が少し膨れ上がることが示されましたが、可能な限り小さく高速に保ちたいと考えています。

パケットを認証しようとしているだけで、ペイロード全体を必ずしも隠蔽しようとしているわけではないことを考えると、秘密鍵から生成された 8 バイトのセッション ID をパケット ヘッダーに入れ、パケット全体を暗号化し、それをハッシュすることができると考えています。 8バイトまで。暗号化されていないパケットを取得し、8 バイトのハッシュをセッション ID の場所に配置して送信します。

これは安全でしょうか?暗号化せずに送信するためだけにパケット全体を暗号化するのは少し洗練されていないように感じます - 私の目標を達成するためのより良い/より速い方法はありますか? 良い経験なので、これを自分でやりたいと思っているので、サードパーティのライブラリや他のプロトコルオプションにはあまり興味がないことに注意してください。

4

1 に答える 1

4

両方のピアが共有シークレットにアクセスできる場合 (Diffie-Helman について話しているため、アクセスする必要があります)、データグラムのハッシュをヘッダーに格納するだけで済みます。受信者は、一致するかどうかを確認します。

追加のセキュリティ対策として、データグラムに「チャレンジ」フィールドを追加し、それをハッシュ プロセスのどこかで使用してリプレイを防止することもできます。

したがって、このハッシュは以下をカバーする必要があります。

  • 共有秘密
  • 挑戦
  • データグラムの内容

編集

「挑戦」は厳密に増加する数です。新しいメッセージを送信するたびにハッシュを変更するだけで、それをデータグラムに追加します。誰かがメッセージを傍受した場合、メッセージを再送信することはできません。受信者は、メッセージを受け入れないようにします。

于 2012-07-04T06:37:24.450 に答える