TOTP: Time-Based One-Time Password Algorighm のRFC読んだのでメモ
2段階認証(Two Factor Authentication: 2FA)の仕様となっているRFC6238を読んだので要点をメモしておきます。
後半はかなりざっくり書いたので英語得意な方は元資料もご確認ください。 https://tools.ietf.org/html/rfc6238
TOTP: Time-Based One-Time Password Algorighm
HOTP(HMAC-based One-Time Password)アルゴリズムについて説明したもので, 時間ベースの要素をサポートします。
背景
- TOTPはHOTPで使われるカウンターの値を時間に置きかえたもの
- HOTPはHMAC-SHA-1がベースになっている
- HOTPはRFC4226を読むべし
- TOTPはHMAC-SHA-1の代わりにHMAC-SHA-256, HMAC-SHA-512をサポートしてもよい (MAY)
必要要件
要件1
- prover(例: tokenやsoft token)とverifier(例: 認証サーバーや評価サーバー)は現在のUnix timeを知っていてOTPの生成に利用できなければならない (MUST)
- Unix timeの定義は http://en.wikipedia.org/wiki/Unix_time を参照して確認
- proverが使う時間の正確性は時刻の同期をどうやってするのかによって影響が出るよ (ネットワーク越しにおけるproverとverifier間で発生するgapの話)
要件2
proverとverifierは同じsecret、またはsecretを生成する手段を共有しなければならない (MUST)
要件3
鍵生成にはHOTPを使わなければならない (MUST)
要件4
proverとverifierは同じtime-stepの値(Xと定義)を使わなければならない (MUST)
要件5
proverごとにユニークなsecretを持たなければならない (MUST)
要件6
鍵はランダムに生成、または鍵生成アルゴリズムから生成されるべきである (SHOULD)
要件7
鍵は不正に書き換えられないデバイスに保存するのがよく(MAY), 認可されていないアクセスや用途からは守られるべきである (SHOULD)
TOTPアルゴリズム
ざっくり言うと、HOTPのカウンターの要素を時間の要素に置きかえたアルゴリズムです。
表記について
- X は秒単位のタイムステップを表し, (デフォルト値は X = 30) システムパラメータです
- TO はUnix timeの起点となるタイムステップカウントで(デフォルトは TO = 0), これもシステムパラメータ
解説
T = (Current Unix time - T0) / X
で計算できます。
T の値は2038年を越えるように32-bitのintegerをサポートしなければなりません(MUST)
proverとverifierの間でXとT0のパラメータのやりとりの確立方法についてはRFC6030を参照
セキュリティの考慮
- 鍵は相互運用性をやりやすくするためにHMACの出力の長さであるべき (SHOULD)
- 鍵は疑似乱数生成器とかでランダムにすべき (SHOULD)
- SSL/TLSやIPsecを使ってセキュアな通信にするべき (SHOULD)
評価とタイムステップサイズ
- ざっくりいうとネットワーク間のギャップがあるのでそれを考慮しないと認証できなくなる
- タイムステップサイズを広げるのはセキュリティも弱くなるので注意
- 狭すぎても認証通らなくなるし、タイムステップが広すぎても次のパスワードが生成されるまで時間がかかるのでre-loginの時に問題になる
- 30秒がおすすめサイズ