TOTP(RFC 6238)とは — 2段階認証の仕組みを理解する
TOTP(Time-based One-Time Password)はRFC 6238で定義されたワンタイムパスワードのアルゴリズムです。Google AuthenticatorやAuthyなどの2FAアプリはこの標準を使っています。シークレットキーと現在時刻からHMAC-SHA1で6桁のコードを生成します。
TOTPの生成ステップ
① シークレットキー(Base32)をバイト列にデコード。② 現在のUnix時刻を30秒で割って切り捨てた値(カウンター)を8バイトのbig-endianで表現。③ HMAC-SHA1でシークレットとカウンターを計算。④ 結果の最後のバイトの下位4ビットをオフセットとして4バイトを取り出し、最上位ビットをクリアして10の6乗で割った余りが6桁コードになります。
Base32エンコードとは
Base32はアルファベット大文字A-Zと数字2-7の32文字を使うエンコード方式です(RFC 4648)。Base64と違い数字0・1や大文字と見間違えやすい文字を避けているため、手入力での誤りが起きにくいという特徴があります。TOTPのシークレットキーの配布にBase32が使われる理由です。QRコードでスキャンする場合も内部的にはBase32文字列が埋め込まれています。
前後のコードが有効な理由
時刻のずれ(クロックスキュー)に対応するため、多くの2FA実装では現在のコードに加えて前後1ステップ(±30秒)のコードも有効と見なします。このツールでは前・現在・次の3コードを表示するため、時刻がわずかにずれている環境でのデバッグに役立ちます。
OTP実装のデバッグ用途
アプリにTOTP認証を組み込む際、生成したコードが正しいか確認するためにこのツールが使えます。同じBase32シークレットを使って、実装したコードとこのツールの出力が一致していれば正しく実装されています。WebCrypto APIのHMAC-SHA1をブラウザで直接実行するため、通信なしで安全に確認できます。