0 / 5
時間同期方式(TOTP、Time-based OTP)
固定パスワードは一度漏れると誰でも使い続けられる。OTPはログインのたびに番号を新しく作り、一度だけ使う。利用者のOTP機器とサーバーは同じ秘密鍵に毎回変わる値を混ぜてそれぞれ同じ計算をし、2つの結果が同じなら通す。方式はその変わる値が何かで分かれる。
変わる値として現在時刻を30秒単位で区切って使う。機器とサーバーが同じ時刻をそれぞれ知っているので、この値はやり取りしない。だから同期方式である。
例:銀行のOTPアプリに6桁の番号が出て、30秒ごとに変わる。
1 / 5
利用者:OTPを作る
今の時刻09:00:12は、09:00:00から始まる30秒区間に入る。機器がこの区間の値と秘密鍵Kを一緒にハッシュ関数に入れ、結果を6桁に縮めて482 913を作る。
2 / 5
利用者 → サーバー:番号を入力
利用者が機器に出た482 913をログイン画面に入力してサーバーへ送る。秘密鍵Kと時刻は送らない。
3 / 5
サーバー:同じ計算をする
サーバーも自分の時計で今の区間(09:00:00から)を求め、登録時に分け合った同じ秘密鍵Kと一緒にハッシュ関数に入れる。結果は482 913である。
4 / 5
サーバー:2つの番号を比べる
受け取った番号とサーバーが計算した番号が同じなので、ログインを通す。サーバーはこの番号を使用済みとして記録し、同じ番号で再びログインできないようにする。
5 / 5
30秒後:番号が変わる
09:00:30になると区間が変わり、機器とサーバーがそれぞれ新しい番号705 261を計算する。だから使っていない番号でも、30秒が過ぎればすぐ使えなくなる。ただしサーバーは入力中に区間が変わる場合を考え、直前の区間1つくらいまでは受け付ける。
1 / 6
利用者:ボタンを押す
利用者がボタンを押すと、機器のカウンターが6から7に上がる。機器がカウンター7と秘密鍵Kを一緒にハッシュ関数に入れて159 044を作る。
2 / 6
利用者 → サーバー:番号を入力
利用者が159 044をログイン画面に入力して送る。カウンターと秘密鍵Kは送らない。
3 / 6
サーバー:同じ計算をする
サーバーもこの利用者のカウンターを別に数えている。次の番であるカウンター7と同じ秘密鍵Kで計算すると159 044になる。
4 / 6
サーバー:2つの番号を比べる
2つの番号が同じなので通す。サーバーは認証に成功したときだけ自分のカウンターを上げる。これでサーバーが待つ次のカウンターは8になる。
5 / 6
利用者:使わなかった番号ができたら
利用者がボタンを2回押したまま、その番号(カウンター8、9)は使わなかった。機器のカウンターは押すたびに上がるので、今回押すと10になり、640 372を作って送る。サーバーはまだ8を待っている。
6 / 6
サーバー:先のカウンターまで計算して合わせる
サーバーのカウンター8で計算した番号は、受け取った番号と違う。サーバーはすぐには拒否せず、9、10のように決めておいた数だけ先のカウンターで計算してみる。10で同じ番号になるので通し、サーバーのカウンターを機器に合わせる(次は11)。決めた数の中で一致する番号がなければ拒否する。
1 / 5
サーバー → 利用者:チャレンジ値を見せる
利用者がログインを始めると、サーバーが乱数5831を新しく作ってログイン画面に表示する。この数がチャレンジ値である。
2 / 5
利用者:チャレンジ値を入力して応答値を作る
利用者が画面の5831をOTP機器に直接入力する。機器はチャレンジ値と秘密鍵Kを一緒にハッシュ関数に入れて応答値273 650を作る。
3 / 5
利用者 → サーバー:応答値を入力
利用者が応答値273 650をログイン画面に入力して送る。秘密鍵Kは送らない。
4 / 5
サーバー:同じ計算をする
サーバーはさっき自分で作ったチャレンジ値5831と同じ秘密鍵Kで計算し、273 650を得る。
5 / 5
サーバー:2つの番号を比べる
2つの番号が同じなので通す。次のログインではサーバーが新しいチャレンジ値を作るので、今回の応答値は二度と使えない。