現代社会では、Webサービスやシステムの普及に伴い、個人情報を保護するためのセキュリティ対策がますます重要になっています。
その中で注目されているのが、多要素認証です。多要素認証とは、ユーザーがシステムにアクセスする際に、複数の異なる認証要素(知識、所有、生体)を組み合わせることでセキュリティを強化する手法です。
本記事では、多要素認証の手法として注目されている 「TOTP」 について、仕組みとともにメリット・リスク対策について解説していきます。
TOTPとは?
TOTP(Time-based One-Time Password)とは時刻をベースにしたワンタイムパスワードを生成する認証方式で、被認証側と認証側が「共有シークレット」を共有し、この 「共有シークレット」 と 「現在時刻」 を組み合わせて、一度限りのパスワードを生成します。
認証時には、入力されたTOTPを検証します。被認証側と認証側のワンタイムパスワードが一致すれば認証成功となります。
一般的に、被認証側(クライアント)は、TOTPを生成するために専用のアプリケーションを使用します。代表的なものとしては、Microsoft AuthenticatorやGoogle Authenticatorといったものがあります。
※ TOTPとよく似たHOTP(HMAC-based One-Time Password)という認証方式がありますが、こちらはイベントをベースにしたワンタイムパスワードの生成方式になります。TOTPはHOTPの概念を元にした認証方式となります。(TOTPについてはRFC 6238、HOTPについてはRFC 4226にそれぞれ明記されています。)
RFC 6238の定めるTOTPの仕組み
TOTPは、以下の計算式に基づいてパスワードを生成します。
TOTP = Truncate ( HMAC-SHA-1 ( 共有シークレット, 現在時刻 ))
共有シークレット :
一般的には16文字から32文字で作成します。
現在時刻 :
エポック秒。UTC時刻1970/1/1/00:00:00からの経過秒数で日時を表現します。
手順
-
HMAC-SHA-1
共有シークレットと現在時刻の範囲であるタイムステップ(TOTPが新しいパスワードを生成する間隔)の整数値を使用して、HMAC-SHA-1ハッシュを生成します。 -
Truncate
生成したハッシュの一部を取り出して、一定の法則で整数値に変換してパスワードを生成します。
詳細は下記を参照
TOTPのメリット
他にも多要素認証は多数ありますが、その中でTOTPには以下のような利点があります。
高セキュリティ
一般的に知られている多要素認証として「SMS認証」がありますが、近年フィッシングやSMSの盗聴などの懸念が指摘されています。
一方で、TOTPは時間ベースでパスワードを生成しており、ごく短い時間しか利用できないためフィッシングも非常に困難です。
また、TOTPに用いる共有シークレットは、一度登録しておけば以降の認証で共有シークレットの情報がネットワーク上に流れることはなく、盗聴のような問題も回避できます。
このように、TOTPを使うことでセキュリティ面のリスクを大幅に軽減できます。
利用者にとって手軽な認証プロセス
TOTPによる認証を行う場合、利用者はスマートフォンのアプリケーションを使用してワンタイムパスワードを生成します。特別なスキルや知識を有することなく手軽に認証まで完了するため、非常に手軽で便利です。
実装者にとってのコストが比較的安い
TOTPの認証の仕組みについてはRFC 6238でも標準化されており、多くのアプリケーションでもサポート明記されている方式です。TOTPのアルゴリズムも比較的シンプルであり、TOTPに関するライブラリも複数存在しているので、実装のコストも比較的安いです。
導入に際してのリスク
TOTPを用いることにメリットがある反面、気を付けていないと思わぬ脆弱性を引き起こしてしまうリスクもあります。
共有シークレット漏洩
共有シークレットはTOTPによる認証にとって中心的な要素になりますので、単純なパターンや短い文字列を使用して共有シークレットを生成してしまうと、攻撃者に容易に推測されて共有シークレットが漏洩する可能性が高まります。
また、生成した後に平文のまま保存する、アクセス制御されていない場所に保存する、などの状態にしている場合も同じく、共有シークレットが漏洩するリスクが高まります。
前後時間の許容によるブルートフォースアタック
時刻をベースにした認証であるゆえ、認証側と被認証側の時刻が同期されていることが重要です。しかし、タイムステップが切り替わる直前にワンタイムパスワードを表示した場合、ユーザーがワンタイムパスワードを入力しているうちにそのパスワードが無効になってしまうことがあります。
そこで、RFC 6238では「前後のタイムステップも許容する」というような一定の猶予を設けることが推奨されています。
これにより、タイムステップのずれを吸収することができユーザビリティを向上させることになる一方で、前後時間の許容により、ブルートフォースアタックの成功確率が上がる可能性が高まります。
私たちが行った対策
思わぬリスクでセキュリティレベルを低下させてしまわないよう、私たちは導入にあたり以下のような観点で対策を行いました。
共有シークレットの生成
共有シークレットは、RFC 4226でも推奨されているように「20バイト」で「暗号学的に強力な乱数」を用いて生成するようにしました。
共有シークレットの保存場所
サーバ側で暗号化して安全な場所に保存して、アクセス制御も厳格に扱うようにしました。
ブルートフォースアタック対策
何度も攻撃されることを防ぐために、試行回数の制限を行いました。これによって、パスワードの入力可能期間が一定時間あったとて連続した攻撃は受けないようにしました。
便利で高い安全性を提供するTOTP認証ですが、リスクを把握してないと思わぬところで脆弱性を招く可能性もあります。導入する前に十分にリスクについて理解しておくことで、TOTPによってさらに高いセキュリティを実現することができます。