リプレイ攻撃を防ぐために、HOTPを使用してOTPを生成し、リクエストを検証しています。クライアントとサーバーのカウンターで発生する可能性のある不一致に対応するために、10回(またはそれ以上)の反復のウィンドウを使用することを考えていますが、これらの反復をどのように処理するかについて少し心配しています。最後に確認されたカウンターよりも小さいトークンをすべて拒否する必要がありますか?または、そこに少し余裕を持たせることはできますか?
編集:
私が尋ねる理由は、私が「サードパーティ認証」を行っているためです。これは、デバイスの所有者がトークン(HOTPを含む)を送信して自分自身を認証し、別のサーバーがそれを使用して何かを取得することを意味しますリソースサーバー(oauth but ...)に少し似ています。したがって、デバイスの所有者が2つのサーバーを認証する場合、カウンターは1567と1568になりますが、2番目のサーバー(1568カウンターを使用)の場合)最初にリソースサーバーに到達し、次にもう一方が拒否されます
ありがとうございました。
「HOTP」の「OT」は「1回限り」を意味します。これは、サーバーが最後に確認された値以下のカウンター値に対応するパスワードを実際に拒否した場合にのみ当てはまります。ここで「少しマージン」があるということは、特定のパスワードが2回受け入れられることを受け入れることを意味します。これは、 [〜#〜] hotp [〜#〜] が防止しようとすることそのものです。
これはすべて、HOTP所有者が自分のパスワードを順番に使用するという考えに基づいています。所有者が、パスワード生成デバイスが作成した最後のパスワードではないパスワードの使用に関心を持つという状況は決してありません。同様に、サーバーがある時点でカウンター値1567に対応するパスワードを受信した場合、サーバーはknows所有者のデバイスが値1568になったことを認識し、たとえばパスワード1565を使用しようとすると不正なプレーの確かな兆候。
デバイスの所有者が気付かないうちにボタンを数回押してしまった可能性があるため、「ウィンドウ」は未来に向かっています。次のパスワードは1568ではなくカウンター値1575に対応し、サーバーは引き続きそれを受け入れます。
言い換えると、RFC 4226 isで指定されているウィンドウの動作に必要なマージンがあります。他の方向にマージンは必要ありません。そのような必要がある場合は、おそらくHOTPをひどく誤用しています。
編集:同じソースからのワンタイムパスワードを消費するサーバーが複数ある場合は、そのようなすべてのパスワードを単一の認証サーバーにルーティングすることを強くお勧めします、theカウンター値を維持します。 (そうでない場合は、はるかに大きな問題があります。)
このような2つのOTPが「故障」して認証サーバーに到達するのではないかと心配している場合は、セキュリティを損なうことなく、実際に少し緩くすることができますが、注意が必要です。ワンタイムパスワードシステムの重要な特性は、各パスワード値を一度だけ使用する必要があることです。 RFC 4226で説明されているセマンティクスを備えたカウンター値は、これらのセマンティクスを維持するための安価で効率的な方法です。サーバーは最後に表示されたカウンターを記憶するだけで済み、それだけです。
ただし、実際に使用されたパスワード値を認証サーバーに記憶させることができます。これは「後方ウィンドウ」である可能性があります。サーバーにはいつでも現在のカウンターがあります[〜#〜] n [〜#〜]、これは最も高いカウンター値であり、覚えているすべてN-9から[〜#〜] n [〜#〜]の範囲のパスワードを参照してください。このようなウィンドウでは、サーバーはパスワードをわずかに順不同で受信できます。カウンター[〜#〜] m [〜#〜]が[〜 #〜] n [〜#〜]、またはN-9から[〜#〜] n [〜#〜]の範囲にあり、まだ見た。サーバーでのプログラミングは少し複雑ですが、それほど複雑ではありません。
重要な注意:HOTPの場合、「後方ウィンドウ」は安全ですが、それは「ワンタイムパスワード」スキームだけに拡張されるわけではありません。 HOTPは [〜#〜] mac [〜#〜] カウンター値に対して計算されるため、これはHOTPにとって安全です-カウンターに依存して繰り返されませんが、可能なカウンターには依存しません数値順に使用されている値。同じことは、ハッシュチェーンを使用するワンタイムパスワードスキームには当てはまりません(各OTPはnext 1のハッシュです)。私がここで言うのはonly HOTPの場合です。