0

API を介してユーザーを認証するために、hmac ベースのワンタイム パスワード プロトコルを実装しようとしています。

アイデアは、ユーザーの一意の識別子 (uid) を秘密鍵とインクリメンタル カウンターに対して暗号化することです。次に、次の呼び出しのためにカウンターをインクリメントします。

encrypt(uid, private_key, counter)
# now increment the counter for the next call

次に、サーバー側で、秘密鍵とカウンターを使用して復号化し、ユーザー識別子 (uid) を取得します。

decrypt(encrpyted_string, private_key, counter)
# now increment the counter for the next received request

これはうまくいきます。カウンターがあるため、各呼び出しは完全に一意 (1 回) です。

しかし、カウンターの同期をどのように処理するのでしょうか? クライアントがリクエストを生成し、次の呼び出しのためにカウンターをインクリメントしてリクエストを送信したが、サーバーがオフラインでリクエストを受信しない場合、またはインターネット接続の問題がありリクエストが通過しない場合はどうなりますか?クライアントは互いのカウンターと同期していません。

これは「リクエストが送信されたかどうかを知る必要がある」というケースですか? つまり、サーバーからの応答ヘッダーを追加して、カウンターがインクリメントされたかどうかを示し、インクリメントされた場合にのみ、アプリのカウンターもインクリメントできます...しかし、逆の場合も同じことが言えます-送信できますリクエスト、サーバーはそれを受け取り、独自のカウンターをインクリメントして応答を送信しますが、サーバーがリクエストを処理している間にインターネット接続が中断され、アプリは応答を受信せず、カウンターをインクリメントしないため、2つが外れています再度同期します。

あなたが私に与えることができる洞察をありがとう。

4

1 に答える 1

1

サーバーとクライアントの間でカウンターを同期するには、OTP の範囲をチェックするだけです。クライアントが現在のカウンターの OTP を送信する場合 - すべて問題ありません。クライアントが現在のカウンター (~15) に近い範囲で OTP を送信する場合 - つまり、クライアントは認証できますが、サーバーのカウンターを更新する必要があります。 . 大きな非同期化が発生した場合は、2 つの一貫した OTP に問い合わせて、広範囲のカウンターでそれらが正しかったかどうかを確認する必要があります。そうである場合は、サーバーカウンターを設定値に設定します。

于 2013-09-10T13:53:33.030 に答える