テクニカルトピックス

【2020.9.8】OTP生成アルゴリズム(TOTP/HOTP)の違いについて

 OTP生成アルゴリズムである「TOTP」と「HOTP」の概要を以下にてご説明します。
 なお、正確にはそれぞれ下記のように定義されています。
 RFC6238: TOTP: Time-Based One-Time Password Algorithm
 RFC4226:HOTP: An HMAC-Based One-Time Password Algorithm


TOTPについて

 TOTP(Time-Based One-Time Password Algorithm)では、時間情報(UNIX Time)を使用してOTPを生成します。具体的にはユーザ情報、秘密鍵情報、時間情報をSeedとして乱数を生成して、その乱数を元にOTPを生成します。
 時間情報には一般的に30秒単位、1分単位の情報を使用します。
 したがって、OTPの有効期限は30秒〜1分となります。


HOTPについて

 HOTP(HMAC-Based One-Time Password Algorithm)は、時間情報ではなく認証回数を使用してOTPを生成します。具体的にはユーザ情報、秘密鍵情報、認証回数をSeedとして乱数を生成して、その乱数を元にOTPを生成します。
 結果的に認証回数によってそのユーザのOTPが一意に決まることから、認証回数を「ポインタ」と称して下図のイメージで説明されることがあります。



両者の長短について

 TOTPはユーザ情報と時間情報によって一意にOTPが決まることから、30秒〜1分の間、同一のOTPが生成されます。(製品によって独自のアルゴリズムを追加して同一のOTPを生成しない場合があります。)
 そのため中間者攻撃(盗聴)やキーロガーを受けた場合、その時間内でなりすましが可能となってしまいます。




 また、認証時に毎回クライアントーサーバ間の通信が必要となります。

 これに対してHOTPでは時間情報を使用しないために中間者攻撃(盗聴)やキーロガーを受けた場合でもなりすましは不可能ですが、認証回数(ポインタ)がずれた場合に認証ができなくなりますので、運用が煩雑になります。


推奨アルゴリズム

 Swivelでは、セキュリティの観点からHOTPを推奨しています。
 HOTPには他にも毎回のサーバ通信は不要であるというメリットがあります。
 なお、上述の「ポインタのずれ」に関しては下記の機能を用意しています。

  • ソフトトークン(Mobile App): 「更新」ボタンをタッチすることでサーバ通信を行いポインタの補正を行います。
  • ハードトークン: 管理者がポインタのリセットを行うか、ユーザがユーザポータルの機能を使用して補正を行います。