2要素認証のTOTPとHOTP、どちらがより安全か?

(更新日: 2017/05/23)

今すぐできる、Webサイトへの2要素認証導入では簡単に2要素認証が導入できること、2要素認証には

  • 時間ベースのOTP(TOTP:Time-based One Time Password RFC 6238)
  • カウンターベースのOTP(HOTP:HMAC-based One-Time Password RFC 4226

があることを紹介しました。Google認証は両方をサポートしています。※

※ 今すぐできる、Webサイトへの2要素認証導入で紹介したライブラリはTOTPのみサポートしています。

TOTPとHOTP、どちらがより安全か?

TOTP、HOTPのどちらを導入してもユーザー名とパスワードのみによる認証に比べ、より高いアカウント(認証)の安全性を維持することができます。しかし、TOTPはHOTPに比べ以下の理由で脆弱です。

  • TOTPは特定の時間内なら何度でも利用できる

つまり、攻撃者が盗聴を行っている場合、TOTPを使っていても簡単にログインできてしまうことを意味します。HTTPSを使っていても安心はできません。HTTPSを使っていてもMITM攻撃で盗聴が可能です。最近でも不正なアプリ(SuperFishなど)でのHTTPS盗聴が問題になったことは記憶に新しいと思います。MITM以外にもキーロガーにも脆弱です。※

HOTPの場合、盗聴やキーロガーが使われていても同じOTPは使えません。このため、TOTPに比べHOTPはより安全です。

今すぐできる、Webサイトへの2要素認証導入で紹介したライブラリはTOTPのみサポートしています。より高度なセキュリティが必要な場合、HOTPを利用した方が良いことは覚えてくとよいでしょう。HOTPを導入する場合、同期がずれた場合に再同期が必要になります。かならず再同期するインターフェースを用意しましょう。再同期はOTPデバイスで2つ以上の連続するOTPを生成させ、生成したOTPを送信してもらい再同期します。

※ そもそも盗聴できることが前提なので、再生攻撃でなくても単純にセッションキーを盗むこともできます。TOPTをより安全に利用するには、一度使った有効なOPTは2回以上使わせないようする、などの対策が考えられます。キーロガーでキー入力だけを盗んでいる場合には有効です。

 

HOTPにも問題がある

HOTPの方が安全性は高い、と言っても良いと思いますがHOTPにも問題があります。

  • ユーザーがOTPを利用しない限り、OTPが更新されない

つまり、攻撃者はアクティブでないユーザーのパスワードを知っていれば、OTPをブルートフォース攻撃できることを意味します。6桁の数字なので完全に総当たりをして100万リクエストで確実にアカウントを盗めます。

TOPTの場合、総当たり攻撃をしようとしても、攻撃中にOTPが変わってしまうためアクティブでないユーザーであってもどのくらいのリクエストで攻撃に成功するかは「運」によります。

TOTP/HOTP、どちらにしてもアプリケーションやファイアーウォールなどで異常なアクセスがある場合にネットワーク的に遮断したり、アカウントをロックする(DDoS型でブルートフォースされた場合、特定IPを遮断しても意味がない)など対策が必要です。

同期がズレることを前提にプログラムを作れば良い、と考えるかもしれません。例えば、サーバー側が保存しているシークエンス+10まで一致していないか?をチェックすれば多少同期がズレても認証できます。しかし、この様な実装にするとブルートフォース攻撃の有効性を高める事になります。(+1なら2倍、+10なら11倍、9万リクエストほどで攻撃に成功することになります)

参考:OTP(ワンタイムパスワード、2要素認証)とタイミング攻撃 HOTPがタイミング攻撃に脆弱だと割と簡単に攻撃できてしまいます。

 

Google認証でHOTPを利用する

Google認証はTOTPのみでなく、HOTPもサポートしています。以下のQRコードは今すぐできる、Webサイトへの2要素認証導入で紹介したGoogle Chartを使ったTOTPのQRコード生成URLの”totp”を”hotp”に変えただけのQRコードです。

https://chart.googleapis.com/chart?chs=200×200&chld=M|0&cht=qr&chl=otpauth%3A%2F%2Fhotp%2FBlog%3Fsecret%3D2ZDZXLT7CJ3O5M3L

このQRコードをGoogle認証で読み込むと、見慣れないリロードボタン付きのOTPが追加されます。追加したOTPは削除できます。間違って必要なOTPを削除しないよう注意してください。

 

まとめ

TOTPは盗聴と再生攻撃に脆弱です。しかしHOTPは、簡単に同期がずれるので使い勝手が今一つです。ただでさえ2要素認証の利用をユーザーに要求するのはハードルが高いので、TOPTでよしとするのは仕方ない選択と言えるでしょう。

両方とも問題があるなら両方の欠点を無くしたOTP(TOTPとHOTPを組み合わせたOTP)を作れば良いのでは?と考える方も居ると思います。Google認証を使わずに、OTPシステムを自前で構築しても構いません。この場合、RFC 2289が参考になります。少し古いのでハッシュ関数としてMD5やSHA1に言及していますが、いま作るならSHA3以上のハッシュ関数を使うべきです。

TOPTでもサーバー側で一度使ったトークンを検出すれば、盗聴による再生攻撃はできなくなります。一手間増えますが、TOPTを使う場合は使用済みトークンは再利用できないようにすると良いです。

Comments

comments

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です