ワンタイムパスワード(OTP)の実装を使用した2要素認証(2FA)方式がよく見られます。現在(以前)のトークンと、場合によっては2つまたは3つ前のトークンがまだ有効です。これはおそらくいくつかの理由で行われます、私は考えることができます:
以前のOTPを受け入れることは悪い習慣ですか?もしそうなら、そのような「機能」の実装に関する一般的な推奨事項は何ですか?
間違っていても修正してください。ただし、トークンが6桁の場合、可能な組み合わせの数は1.000.000(000000-999999)です。したがって、30秒間で受け入れられるトークンは100万分の1にすぎません。ただし、以前の(またはさらに多くの)トークンを受け入れる場合、基本的に100万分の2、3、4、または5の可能性があります
以前に、ユーザーが既に認証されているOTPよりも古いOTPを意味する場合は、これは悪い習慣と見なされます。 OTPは1回使用することを目的としているため、その名前が付けられています。 2FAの要点は、それがセキュリティ三位一体の「あなたが持っているもの」を表すということです。トークンの2回の使用を許可すると、OTPが防止する目的の目的が無効になります。それを「知っているもの」に変えると、2番目のパスワードになります。
この問題は通常、ブルートフォースの問題ではありません。たとえば、タイムウィンドウが比較的短いTOTPの場合、ブルートフォースはそれを回避するために実際には使用されません。現在または過去のOTPの再利用を許可するサイトの攻撃者としての使用例は傍受です。
クライアントがOTPを使用しており、何らかの方法で傍受された場合、攻撃者は問題をユーザー名とパスワードに限定します。彼らが情報を傍受している場合は、これらもおそらく傍受しています。
理論的にはカウンターまたは移動係数があまり頻繁に増加しないため、HOTPの場合、問題はさらに悪化します。ユーザーが認証された最後の、または前のOTPが長期間有効である可能性が高いことを意味します。サーバーの実装によっては、数か月かかる場合があります。
以前に、現在生成されているがまだ使用されていないOTP以前のOTPを意味する場合、制限内ではありません。 OTPの標準実装では、通常、「ウィンドウ」を適用して同期の問題を解決します。 TOTPの場合、5秒のウィンドウ(前方および後方の両方)が使用されますが、これは、私が見たどの実装でも、ユーザーが認証した最後のOTP以前のOTPを常に許可しません。 15秒のウィンドウで15秒の移動ステップの場合、45秒の時間枠で認証に使用できるOTPは3つあります。1つは過去、現在と未来の1つです(これは間隔が同じであると想定しています)移動ステップとして)。この背後にある理由は、@ cornelinuxの回答でエレガントに説明されています。
HOTPの場合、ウィンドウは「先読み」ウィンドウです。ユーザーが認証した最後のOTPは、受け入れられた前のOTPの次の10個のOTP内にある場合に許可され、実装はその10個から次の10個を計算し、入力された次のOTPに対するチェックを行います。 1つが正常に使用される前に、ウィンドウで使用されていないOTPを無視することは、かなり良い意味があります。
注:
HOTPでは10は任意です。通常、この係数は、認証に成功するために必要なOTPの数の約2.5倍です。したがって、ユーザーが3つのHOTPを認証する必要がある場合、ウィンドウは現在のOTPの約8倍になります。
TOTPでは5秒も可変です。場合によっては、移動ステップの100%もの大きなウィンドウを見たことがあります。したがって、30秒のステップと30秒のウィンドウにより、コードは1:30の間有効になります。繰り返しになりますが、現在の反復の前と後の両方で展開します。
RFC6238(TOTP)もご覧ください。 https://tools.ietf.org/html/rfc6238#page-6
OTP値を確認するためのタイムウィンドウがあります。 (@Nalaurienが指摘したように、一度だけ)。古い、またはさらに新しいTOTP値を許可することには、ハードウェアトークンのクロックスキュー、およびユーザーがOTP値を読み取って入力する必要がある時間も含まれます。
TOTPは2011年に指定されたことに注意してください。TOTPの基礎であるHOTPは2005年にも指定されました。iPhone1は2007年にリリースされました。たぶんドリフトの時間で。
また、HOTP(RFC4226)およびTOTP(RFC623)は、GoogleまたはAppleではなく、認証ハードウェア会社で働いている人々によって書かれていることに気付くかもしれません。 ;-)