スマホの認証アプリの「30秒ごとに変わる6桁」(TOTP)が内部で何をしているかを RFC ベースで掘った。
全体像
時刻 ──▶ カウンタ T ──▶ HMAC(K, T) で20バイトのハッシュ ──▶ 6桁の数字
サーバとアプリが同じ秘密鍵 K と時刻から同じ計算を独立に行い、6桁が一致するか見るだけ。K は通信路に流れないし、HMAC は一方向なので数字から K を逆算できない。
TOTP は「暗号化」ではない。使うのは HMAC(鍵つきハッシュ)=一方向で、元に戻せない。本質は秘匿ではなく「正しい鍵を持つ人だけが値を再現できる」認証(MAC)。
RFC(2段構え)
- RFC 4226 — HOTP
- RFC 6238 — TOTP