web-dev-qa-db-ja.com

タンブックでチャレンジレスポンス?

安全でない可能性のあるWifiネットワークで、webAppを使用してモバイルデバイス(クライアント)とホームデバイス(サーバー)の間の接続を保護しようとしています。

通信は非同期であり、「 リプレイアタック "」を防止しようとしています。

チャレンジレスポンスについて考えていましたが、「チャレンジを要求し、チャレンジを受信し、チャレンジを解決してメッセージを送信する」のオーバーヘッドは、パフォーマンスの問題です。

だから私はある種の [〜#〜] tan [〜#〜] オンラインベーキングのような本のアプローチを使うことを考えていました:

最初に、クライアントは保存する一連のチャレンジを要求します。サーバーはそれらのチャレンジを保存し、すでに使用されているチャレンジの数を追跡します。

N個のチャレンジだけが残っている場合、サーバーは新しいチャレンジを作成し、次の応答とともにそれらをクライアントに送信します。このように、クライアントはほとんどの場合、すべてのリクエストの前に最初にチャレンジを要求するオーバーヘッドなしに、十分なチャレンジを持っている必要があります。

例:

  • クライアントはログインを希望し、最初にチャレンジを要求し、ユーザー名/ユーザーIDを指定します。
  • サーバーはn個のチャレンジを作成し、指定されたユーザーIDに保存してから、ユーザーに送信します。
  • クライアントはchallenge-idとhash(challenge、shared-secret)を送信します。
  • サーバーは、共有シークレットでハッシュされた保存済みチャレンジ(challenge-idで識別)を比較し、正しい場合は成功を返し、現在使用されているためチャレンジを削除します。

それからそれはより簡単になります

  • クライアントがサーバー上のAPIエンドポイントXを呼び出したいと考えており、ヘッダー(challenge-id、hash(challenge、shared-secret))が追加されたリクエストを送信します
  • サーバーはチャレンジをチェックし、upponが成功するとそれを削除し、メソッドxを実行して、応答を返します。それに応じて、ヘッダーに新しいチャレンジを追加します(つまりchallenge_id-xyz:45egrgh3gw43gw43zrezh54egh44zg54b54esb ... 54sreh5j

クライアントの課題が少ない場合

  • クライアントがAPIポイントXを呼び出したい、ヘッダーにチャレンジを含むリクエストを送信する
  • サーバーはチャレンジをチェックし、成功するとそれを削除し、クライアントがチャレンジが少ないことを認識し(保存されているチャレンジの量が少ないため)、新しいチャレンジを作成します。 API Point Xの応答を送信し、ヘッダーに新しいチャレンジを追加します。

このような概念はすでにありますか?そうでない場合、これは「自分の暗号を焼く」のように聞こえますか、それとも合法に聞こえますか?または、httpのオーバーヘッドをあまりかけずにこれを行うためのより良い方法はありますか?

3
Andresch Serj

これを行うためのより良い方法があるかどうかについてのあなたの質問によく答えて、私が以前に使用した少し単純な解決策がその仕事に任されているのではないかと思います。

チャレンジの事前定義されたリストを生成して送信するのではなく、クライアントとサーバーにそれぞれ、ヘッダーで渡すハッシュに予測可能な増分値を追加させます。クライアントとサーバーの両方が、セッションの呼び出し/応答の数をカウントし、重複した(再利用された)ハッシュで受信したものを拒否できます。増分値は、カウントのように単純な場合もあれば、特に妄想を感じている場合は、カウントに対して実行される単純な数学関数の場合もあります。

次のようになります。

  • クライアントはログインを希望し、ユーザーIDとハッシュ(共有シークレットとユーザーIDなどの賢明な組み合わせ)を使用してログイン要求を送信します。
  • サーバーはハッシュを調べ、正しい場合は成功とセッショントークンを返します。

今、行われた呼び出しごとに:

  • クライアントは、ヘッダーハッシュ(セッショントークン、増分値)を追加して、サーバー上のAPIエンドポイントXを呼び出します
  • サーバーは、ハッシュがセッショントークンとこのセッションに期待される次の増分値と一致することを確認します。一致する場合は、ハッシュで署名されたエンドポイントから応答を送信します(セッショントークン、次の増分値)。
  • クライアントは、応答ヘッダーにセッショントークンのハッシュと、期待していた次の増分値が含まれていることを確認します。

そして繰り返します。

ヘッダーに再利用されたハッシュを含む要求/応答が到着した場合、増分値は順序が狂い、クライアント/サーバーはそれを拒否できます。また、セッションの課題のリストを生成、送信、および維持することについて心配する必要はありません。

ここでの欠点は、複数の呼び出しを行うことによって引き起こされる問題と、ネットワークの問題またはアプリケーションの設計/要件のいずれかが原因でそれらが順序どおりにならないことです。これを回避する方法には、クライアントに中央ポイントを追加して、セッションのすべての要求と応答をマーシャリング/キューに入れるか、クライアントアプリケーション内のスレッドまたは会話ごとに個別のセッションを作成することが含まれます。これは開発中の追加の考慮事項かもしれませんが、トラフィックを最小限に抑えるという要件が十分に重要である場合は、努力する価値があるかもしれません。

コメントや考えは大歓迎です。

2
GreatSeaSpider