TOTP の時計のずれ
ある Web サービスは,TOTP(時間ステップ 30 秒,T0 は Unix 時刻の 0)による 2 要素認証を導入している。検証サーバは,OTP の受信時刻から求めた時間ステップと,その一つ前の時間ステップの OTP だけを受け付ける。サーバの時計は正確であるが,ある利用者のスマートフォンの時計は 50 秒遅れている。この利用者が OTP を表示させた直後に入力した場合の認証結果として,適切なものはどれか。ここで,入力と通信による遅延は無視できるものとする。
- ア時計のずれ(50 秒)が時間ステップ(30 秒)より大きいので,入力した時刻にかかわらず,常に失敗する。
- イ一つ前の時間ステップまで受け付けるので,60 秒までの遅れは許容され,入力した時刻にかかわらず,常に成功する。
- ウサーバ時刻の秒が 20〜29 秒又は 50〜59 秒のときに入力すると成功し,それ以外の時刻では失敗する。
- エサーバ時刻の秒が 0〜19 秒又は 30〜49 秒のときに入力すると成功し,それ以外の時刻では失敗する。
正解と解説を見る
正解 ウ
この問題の基礎知識
- TOTP は,共有した秘密鍵と,現在の Unix 時刻から T0 を引いて時間ステップで割り,切り捨てた値 T から HMAC を用いて OTP を生成する方式である。
- サーバは受信時刻から自らの T を求めて照合するので,端末の時計がずれると端末の T がサーバの T と異なり得る。成否はずれの秒数ではなく,両者の T の差で決まる。
- 同じ秒数のずれでも,ステップの境界をまたぐかどうかで T の差は変わるので,受信時刻がステップ内のどの位置にあるかで場合分けして考える。
OTP は時間ステップ単位で比較されるので,50 秒のずれでもステップの差は入力した時刻によって 1 又は 2 になる。差が 1 のときは一つ前のステップとして受け付けられるので,常に失敗するわけではない。
一つ前のステップまで受け付ける場合に許容される遅れは,受信時刻がステップ内のどこにあるかによって 30〜59 秒の範囲で変わる。50 秒の遅れは,受信時刻がステップの開始から 20 秒以上経過しているときしか許容されない。
端末は 50 秒前の時刻でステップを計算する。例えば 10:00:25 に入力すると端末の時刻は 9:59:35 で,サーバのステップの一つ前に当たり受け付けられる。秒が 0〜19 秒又は 30〜49 秒のときは差が 2 ステップになり失敗する。
例えば 10:00:10 に入力すると端末の時刻は 9:59:20 で,そのステップ(9:59:00〜9:59:29)はサーバのステップ(10:00:00〜10:00:29)の二つ前に当たり,受け付けられない。成功と失敗の時間帯を逆に捉えている。
照合の根拠(4 件)
- 前提: 時間ステップ X = 30 秒
X represents the time step in seconds (default value X = 30 seconds) and is a system parameter.
RFC 6238 · Section 4.1(新しいタブで開きます) - 前提: T = floor((Unix 時刻 − T0) / 30) でステップを求める
More specifically, T = (Current Unix time - T0) / X, where the default floor function is used in the computation.
RFC 6238 · Section 4.2(新しいタブで開きます) - 前提: 受信時刻のステップに加えて過去のステップの OTP とも照合する(問題文では一つ前まで)
The validation system should compare OTPs not only with the receiving timestamp but also the past timestamps that are within the transmission delay.
RFC 6238 · Section 5.2(新しいタブで開きます) - イ(誤り): 許容されるずれは受信時刻がステップ内のどこにあるかで変わる(一つ前までなら最大で約 29 + 30 = 59 秒)
If the time step is 30 seconds as recommended, and the validator is set to only accept two time steps backward, then the maximum elapsed time drift would be around 89 seconds, i.e., 29 seconds in the calculated time step and 60 seconds for two backward time steps.
RFC 6238 · Section 6(新しいタブで開きます)
検算: サーバ時刻 t = 30n + r(0 ≦ r < 30,ステップ n)。端末時刻 t − 50 = 30n + (r − 50)。r ≧ 20 なら r − 50 ∈ [−30, −20) で端末のステップは n − 1(差 1,受理)。境界 r = 20 では t − 50 = 30(n − 1) ちょうどで floor により n − 1(受理)。r < 20 なら r − 50 ∈ [−50, −30) でステップ n − 2(差 2,拒否)。Unix 時刻のステップは毎分 0 秒と 30 秒に始まるので,成功は秒が 20〜29 と 50〜59(ウ)。例: 10:00:25 → 端末 9:59:35(一つ前),10:00:10 → 端末 9:59:20(二つ前)。