OTPとは
OTPは、一度だけ、または短時間だけ有効になる認証コードやパスワードです。正式名称はOne-Time Password(ワンタイム・パスワード)です。
固定パスワードと違い、盗み見られた値をあとでそのまま使い回しにくくします。ただし有効時間内に偽サイトから本物サイトへ中継されれば悪用されるため、一度限りであることとフィッシング耐性であることは別です。
OTPの安全性は数字の桁数だけでは決まりません。共有秘密の保管、カウンターまたは時刻の同期、使用済み判定、試行制限、配送経路を合わせて考えます。

発行から失効までを一つの流れで見る
- Provision登録時に共有秘密や認証器情報を安全な経路で利用者側へ渡し、アカウントへ結び付けます。
- Generate共有秘密とカウンターまたは現在時刻をHMACへ入れ、短い表示コードへ変換します。
- Submit利用者は正しいサービスの認証画面へコードを入力し、固定パスワードなどと組み合わせます。
- Verifyサーバーは同じ秘密と候補カウンター・時刻窓から値を計算し、一定時間で比較します。
- Consume受理したカウンターや認証トランザクションを記録し、同じコードの再利用を拒否します。
- Recover端末紛失時は認証器を失効し、予備認証器または別管理の回復コードで復旧します。
HOTPは回数、TOTPは時刻を変化値に使う
HOTP(HMAC-Based One-Time Password/エイチマック・ベースド・ワンタイム・パスワード)は、認証器とサーバーが共有するカウンターを進めてコードを作ります。未使用コードを何回も生成するとカウンターがずれるため、サーバーは許容範囲を探索して再同期します。
TOTP(Time-Based One-Time Password/タイム・ベースド・ワンタイム・パスワード)は、HOTPのカウンターに時刻区間を使います。一般的には数十秒ごとに表示が変わりますが、端末時刻が大きくずれると一致しません。サーバーは前後の狭い時刻窓を許容しつつ、広げすぎて試行候補を増やさないようにします。
共有秘密を持つ両端が信頼点になる
認証アプリ型OTPでは、登録用QRコードなどに共有秘密が含まれます。画面共有、写真、バックアップ、同期事業者から漏れると、攻撃者も同じコードを生成できます。登録直後に秘密を再表示し続けず、サーバー側でも暗号化や専用鍵管理で保護します。
SMS OTPは端末内の共有秘密で生成するのではなく、通信事業者の回線を通じて配送します。番号移管、SIMスワップ、転送、メッセージ表示、通信圏外という別のリスクがあります。
有効時間内のreal-time中継は止められない
攻撃者が本物そっくりの画面でパスワードとOTPを受け取り、直ちに本物サービスへ送れば、未使用のまま間に合うことがあります。認証後のセッションCookieまで奪う攻撃もあります。
利用者はパスワード管理ツールのドメイン照合、ブラウザーのアドレス、端末からのログイン通知を確認します。サービス側ではFIDO/WebAuthn系のsite-bound認証を優先し、OTPには試行制限、短い有効時間、取引内容との結び付けを加えます。
回復コードはOTPと似て見えても性質が違う
回復コードは事前に発行する使い切りの長い秘密で、時刻やカウンターから連続生成するOTPとは異なります。印刷物や暗号化保管庫など主端末とは別の場所へ置き、使用済みコードを再利用できないようにします。
OTPの不具合では、端末時刻、登録したアカウント名、共有秘密の再登録、許容窓、使用済み判定、試行制限を順に確認し、むやみに時刻窓を広げません。
counter型と時刻型OTPの生成・検証の確認資料:RFC 4226「HOTP: An HMAC-Based One-Time Password Algorithm」、RFC 6238「TOTP: Time-Based One-Time Password Algorithm」