dshimizu/blog

アルファ版

TOTP をわかっていないので調べたことのメモ

はじめに

TOTP の Multi Factor Auth を触ることになったものの、TOTP をよくわかっていないので調査メモ。

仕様

RFC 6238 で定義されている。

また、ベースとなっている HOTP は RFC 4226 で定義されている。

HOTP(HMAC-Based One-Time Password)

HOTP のワンタイムパスワードの生成は、秘密鍵とカウンタ値をもとにワンタイムパスワードを生成する形と思われる。サーバー側のカウンタは、クライアント側から送られたHOTPの値と一致した場合に増分するらしい。クライアント側とサーバー側でカウンタ値がずれる場合があるので、再同期する必要があるらしい。*1

  • RFC 4226 の内容抜粋

    7.2. Validation of HOTP Values The HOTP client (hardware or software token) increments its counter and then calculates the next HOTP value HOTP client. If the value received by the authentication server matches the value calculated by the client, then the HOTP value is validated. In this case, the server increments the counter value by one.
    : 
    7.4. Resynchronization of the Counter Although the server's counter value is only incremented after a successful HOTP authentication, the counter on the token is incremented every time a new HOTP is requested by the user. Because of this, the counter values on the server and on the token might be out of synchronization.

8バイトのカウンター(C)と秘密鍵(K)を元に SHA1 ハッシュ関数 HMAC-SHA-1(K,C) で得られた値から 31 ビットを取得して数値に変換したものがワンタイムパスワードになるようで、以下で表されている。

HOTP(K,C) = Truncate(HMAC-SHA-1(K,C))

HMAC についても RFC で定義されている。詳しくわかっていない。

TOTP(Time-Based One-Time Password)

TOTP のワンタイムパスワードの生成は、秘密鍵と時刻をもとにワンタイムパスワードを生成している。

時間(T)と秘密鍵(K)を元に SHA1 ハッシュ関数 HMAC-SHA-1で得られた値から 31 ビットを取得して数値に変換したものがワンタイムパスワードになるようである。

TOTP = HOTP(K, T)

T は、その時の Unix 時間 (Current Unix Time) から T0(カウントを開始する時間、と定義されているが、デフォルトはUnix epoch(1970年1月1日午前0時0分0秒)) の差を、X(TOTP を再生成するまでの時間でデフォルトは 30 秒)になる。このうち、T0 と X はシステムパラメータになるらしい。

T = (Current Unix time - T0) / X

多分こんな形で表される。

TOTP = Truncate(HMAC-SHA-1(K, (Current Unix time - T0) / X))

また、秘密鍵の共有は、よく QR コードが用いられる。

処理の概要

おそらくこんな感じになる。