3

これには複数の質問が含まれますが、それらは多少関連しているため、まとめて投稿したいと思いました。

私がやっていること: サーバーと通信するためにユーザーがログインする必要があるサーバークライアントアプリケーションを書いています。現在、いくつかのマイナーな変更を加えて、udp を使用しています (そして、確かに udp を使用したいと思っています)。

最初の部分:

ユーザー接続を保存する最良の方法は何ですか?

私のアイデア:

  1. 接続が許可されているすべてのクライアントのすべてのアドレスを格納するコンテナーを作成します (ログインの成功後)。
  2. すべてのセッション ID を格納するコンテナーを作成します (セッション ID はすべてのパケットで送信されます)

他のアイデアを歓迎します (特にそれらが既に使用されている場合)

私の懸念:

  1. 誰かがパケットの送信者のアドレスを変更できますか? (私はそう仮定します)
  2. セッション ID が傍受される可能性があります。(この問題を抱えているいくつかの大企業を覚えています)

第二部:

それでも、パケットを暗号化する必要があります。(2) の場合、暗号化をセッション ID に関連付けて、ユーザーからのパケットのみをそのクライアントに対応する正しいセッション キーで復号化できるようにすることができます (AES のように、例を示すだけです)。

これには、高速な適切なアルゴリズムが必要です (単一のクライアントから毎秒 256 バイトのパケットが 30 ~ 50 個送信される場合があります)。

  1. これにはどのアルゴリズムが適していますか (RSA は少し遅すぎるようです)。
  2. このアルゴリズムはどのように機能しますか? (非常に短い要約ですが、詳細情報のソースは大歓迎です)
  3. 元のパケットと同じ大きさになるようにパケットを暗号化しますか、それともより大きくして、これらのパケットを組み立てるサーバー側で何らかのキャッシュメカニズムを作成する必要がありますか?

ああ、ところで。公開/秘密鍵、ハンドシェイクなどについての説明は必要ありません。このアルゴリズムを商用製品で使用することを知っておくことは重要かもしれません (ライセンスに関して)。

4

2 に答える 2

4

これは、特定のアプリケーションを念頭に置いていないと答えにくいですが、一般的なヒントをいくつか挙げてみます。

接続が許可されているすべてのクライアントのすべてのアドレスを格納するコンテナーを作成します (ログインの成功後)。

これは、悲しいことにまだ使用されており、IPv4 の枯渇のために実際に増加している NAT のため、単純に機能しません。少なくとも src-ip+src-port が必要です。それでも、モバイル ユーザーを考慮すると、IP をセッション ID として使用したくない場合があります。平均的なスマートフォンは、セルラー ネットワークと WiFi ネットワークを非常に簡単に切り替えますが、ほとんどの場合、IP スタックが完全に再起動されるため、新しいトラフィックを以前のトラフィックと関連付ける方法はありません。これは問題になる場合とそうでない場合がありますが、IP アドレスを制御できない限り、このアプローチを使用することはありません。

すべてのセッション ID を格納するコンテナーを作成します (セッション ID はすべてのパケットで送信されます)

これは実際には一般的なソリューションです。最初のソリューションは、source-ip をセッション ID として使用する特定の実装です。セッション ID の管理が心配な場合は、UUIDを使用してください。セッション ID 間の衝突の可能性は非常に低くなります。または、公開鍵/秘密鍵の暗号化を使用する場合、ユーザーの公開鍵をセッション ID として使用できます。

ここで重要な部分は、セッション ID をネゴシエートする方法です。ユーザーに選択させたい場合や、サーバーに選択させるために「特別な」セッション ID (たとえば 0) を使用したい場合があります。何が最適かは、アプリケーションによって異なります。

誰かがパケットの送信者のアドレスを変更できますか? (私はそう仮定します)

確かに、これは中間者攻撃(転送中のパケットに対して行われる場合) またはIP アドレス スプーフィング(偽の IP を含むパケットを送信する場合) と呼ばれ、ほとんどのエンド ユーザーには検出されません。多くのネットワークではこれに対する保護がありますが、たとえばReverse Path Forwardingを使用しています。

セッション ID が傍受される可能性があります。(この問題を抱えているいくつかの大企業を覚えています)

暗号化されている場合: たぶん (後述)。暗号化されていない場合: 確かに。

次に、暗号化の質問の全体について:

通常、通常のトラフィックには対称キー暗号化スキームを使用する必要があります。AES は良い選択ですが、他にもあります。調査を行ってください。

ただし、暗号化の設定に問題があります。一般に、暗号化キーは盗み見されることなく、両側で安全に取得する必要があります。キーを航空便で送ろうとすることもできますが、ほとんどのユーザーがそれをユーザーフレンドリーだと思うとは思えませんし、それでさえ本当に安全ではありません.

そこで、非対称キー暗号化スキームの出番です。通常、RSA のようなものを使用して初期接続 (セッション ID、暗号化キー、おそらくいくつかのアカウンティングなど) をネゴシエートし、対称キーが実際のトラフィックを引き継ぐようにします。人気のあるスキームはDiffie-Hellman 鍵交換ですが、これ以外にも他にもあります。

チャネルを非常にうまく保護できると言われていますが、中間者攻撃は常に懸念事項です. どちらか一方 (クライアント) を制御できないため、実際にこれを防ぐためにできることはほとんどないことがわかりました。感染したマシンである場合、すべての賭けは無効になります。

  1. 着信セッションで検証できる、ユーザーごとに事前に配布された固有の秘密鍵を使用します。これにより、他の方法でそのキーを取得しない場合、mitm 攻撃が難しくなりますが、自動生成されていない秘密キーは、多くの場合、使いやすさと組み合わせるのが困難です。それらを配布する方法(くそ、そこでmimをどのように処理すればよいですか?)、それらをユーザーに保存する方法(ああ、彼はラップトップ、iPhoneとiPadを使用しています)、紛失した場合にそれらを回復する方法に問題があります。 ..
  2. すべてのトラフィックがクライアントによって開始され、サーバーの公開鍵ですぐに暗号化されることを確認してください。秘密鍵を配布する必要がないため、これは簡単です。ただし、ハッカーはサーバーの公開鍵を独自の鍵に置き換えることができますが、それは非常に困難であり、正しく行うとクライアント コンピューターにウイルスをインストールすることになります。
  3. クライアント アプリケーションでサニティ チェックを実行します。たとえば、サーバー IP の既知のプールに接続していることを確認し、DNS クエリが正しいかどうかなどを確認します。フェイルセーフとは言えませんが、潜在的なハッカーを思いとどまらせる簡単な検証です。
  4. ユーザーを教育します。これは、多くの銀行が行っていることです (少なくとも私が住んでいる場所では)、定期的なウイルス対策チェックを行い、信頼できる WiFi ネットワークのみを使用し、DNS サーバーを検証します... . もちろん、教えるのが難しいこともありますが、少しの常識があれば、長い道のりを歩むことができます。

ああ、最後に、UDP の部分について実際にコメントしたいのですが、本当によろしいですか? このスキームのほとんどすべて、さらにはさらに多くのものがTLSでカバーされているため、これはboost asioに統合されています。トラフィックがそれほど低レートである場合、UDP が提供する利点を必要とするアプリケーションであるとはほとんど想像できません。voip を保護したい場合を除きます。これは既に行われています。車輪を再発明しないでください。

于 2012-10-01T07:06:56.797 に答える
0

すべての暗号化システムには、暗号鍵が必要です。このキーは、暗号化された送信を開始する前に交換する必要があります。このキーを暗号化する前に、暗号化されていないネットワーク接続を介して送信すると、攻撃者がこのキーを傍受して接続を傍受する可能性があります。攻撃者がキーを変更できる場合、送信を操作することもできます。これを防ぐ唯一の方法は、ネットワーク経由ではなく別のメディアでキーを交換するか、信頼できる機関によって署名された暗号証明書を使用することです。

いくつかの Google キーワード: 暗号化証明書。公開鍵暗号化; SSL; TSL; 中間者攻撃

ほとんどの暗号化アルゴリズム (AES など) はブロック暗号です。つまり、固定サイズのブロック (256 または 512 バイトなど) でメッセージを暗号化します。メッセージがブロック サイズに収まらない場合、暗号化の前にゼロが埋め込まれます。多くの短いメッセージを送信している場合、これにより多くのオーバーヘッドが発生する可能性があります。

パディングを必要としないストリーム暗号もありますが、それらの開発はブロック暗号ほど高度ではありません。それらのほとんどは、暗号化の専門家によってまだ非常に強力で信頼できるとは見なされていません.

于 2012-10-01T06:34:07.290 に答える