TOTPを総当たり攻撃で破るのに必要な時間

この記事は最終更新日から3年以上が経過しています。

はじめに

TOTPは多要素認証(二段階認証)の一つで、ワンタイムパスワード(OTP)をスマートフォンなどにインストールされたソフトウェアで生成し、それをログインの際に用いる認証方法である。この記事では、攻撃者が総当たり攻撃を用いてTOTPを破るまでに必要な時間を計算することにする。
なお、筆者は数学の知識がそれほどあるわけではないので、もし微妙な部分があったら気軽にコメントなどで指摘してほしいと思う。

アイディア

この記事のアイディアは、「TOTPが30秒に一度パスワードが変更される認証」と考えることで、下記の記事の数式を用いることである。

パスワードの最適変更間隔とその定量的効果の評価

パスワードが変更される際の、攻撃者がパスワードを知るために必要な平均時間

これは上記の記事で述べられていることを、僕が再度書き下したものなので、最後の結論以外はあまり読む必要がない。

攻撃者がパスワードを知るために必要な時間

まず、計算に必要なパラメータを次のように定義する。

記号 意味
n パスワードの空間
τ 一度の試行に必要な時間

まず、攻撃者がn通りのパスワードの中から正解のパスワードを知るために必要な時間を計算する。n通りのパスワードの中から正解のパスワードを知るためには、最大でn1回の試行をすればよいので、パスワードを知るために必要な平均時間Teは次のようになる。

Te=i=1n(i1)τn=nτ2

m回の試行でパスワードが判明する時間の期待値

TOTPのパスワードがmτ秒で変更されるとすると、攻撃者はパスワードが変更される前までにm回の試行を行うことができる。
これは、さきほどと同じように、次のようになる。

Tj=1=i=1m(i1)τn=m(m1)τ2n

m+1, m+2回の試行でパスワードが正解する確率

m+1回の試行でパスワードが正解するということは、まず1回目の試行でn1nの確率で失敗し、さらに2回目の試行ではn2n1の確率で失敗し……と失敗をひたすら繰り返してゆき、m回目の試行でnmn(m1)の確率で失敗した後、パスワードが変更されてm+1回目の試行で1nで成功する、という確率となるので、次の式で求められる。

pm+1=n1nn2n1nmn(m1)1n=nmn2

m>2として、同様にm+2の場合を考える。

pm+2=n1nn2n1nmn(m1)n1n1n1=nmn2

最初のパスワード変更から2回目の変更までの間にパスワードが正解する時間の期待値

最初のパスワード変更があったということは、攻撃者はすでにm回の試行をしていることになるので、時間はmτからスタートとなる。時間の期待値は“確率×時間”なので、次のようになる。

Tj=2=i=m+12m(i1)τ(nm)n2=3m(m1)τ(nm)2n2

2回目のパスワード変更が行われた次の試行でパスワードが正解する確率

これは、最初のパスワード変更までにパスワードが正解する確率Pj=1と、最初のパスワード変更から2回目のパスワード変更までにパスワードが正解する確率Pj=2を用いて次のように表せる。

p2m+1=(1Pj=1Pj=2)1n

まず、最初のパスワード変更からm回の試行でパスワードが正解する確率Pj=11nm回試行したものなので、次のようになる。

Pj=1=mn

同様に、

Pj=2=m(nm)n2

よって、

p2m+1=n2mnm(nm)n3=(nm)2n3

2回目のパスワード変更から3回目のパスワード変更までの間にパスワードが正解する時間の期待値

さきほどのTj=2と同様に次のようになる。

Tj=3=i=2m+13m(i1)τ(nm)2n3=5m(m1)τ(nm)22n2

j回目のパスワード変更が行われた次の試行でパスワードが正解する確率

上記の結果から次のようになると推測される1

Pj=m(nm)j1njpjm+1=(nm)jnj+1

j回目のパスワード変更からj+1回目のパスワード変更までの間にパスワードが正解する時間の期待値

これは次のようになる。

Tj=i=(j1)m+1jmp(j1)m+1=(2j1)m(m1)τ(nm)j12nj

攻撃者が定期的に変更されるパスワードを知るためにかかる平均時間

これはTjを無限回足したものであるので、次のようになる。

Tc=j=1Tj=(m1)(2nm)τ2m

TOTPへの応用

TOTPでは上で求めた変数のうち、いくつかを埋めることができる。

変数
n 251042
mτ 30(秒)

すると、m=30τとなるので、Tcからmを排除することができ、τ(一回の試行に必要な時間)とパスワードが正解する平均時間Tcの関数を次のように作ることができる。

y=(30τ1)(2n30τ)τ230τ=(30τ1)(2n30τ)τ260

これをプロットすると次のようになる。なお、横軸が1回の試行に必要な時間τであり、縦軸が攻撃者がパスワードを知るために必要な時間yである。

スクリーンショット 2016-03-01 0.15.23.png

スクリーンショット 2016-03-05 18.39.25.png

もし0.2秒で1回の試行ができるとすると、約5万秒(半日)でTOTPの正解に辿りつくということになる。

まとめ

今回はTOTPをパスワードを変更するという操作とみなすことで、攻撃者がTOTPを総当たり攻撃で破るために必要な時間を計算することができたと思う。また計算が正しいとすれば、30秒に一度パスワードが変更されるとはいえ、総当たり攻撃に対しては別の対策を講じる必要があると思う。


  1. 参考サイトでは証明をしているが、ここでは省略する。 

  2. この記事で考えているTOTPは、6桁の数字で構成され、「現在」と「未来」と「過去1」「過去2」の合計4つのパスワードを許容するため、やや雑だが4106=125104より、n25104としている。 

yyu
暗号やプログラム言語の記事をよく書きます。 最近ではZenn.devにも投稿してます。 https://zenn.dev/yyu
https://twitter.com/_yyu_
recruitmp
結婚・カーライフ・進学の情報サイトや『スタディサプリ』などの学びを支援するサービスなど、ライフイベント領域に関わるサービスを提供するリクルートグループの中核企業
http://www.recruit-mp.co.jp/
ユーザー登録して、Qiitaをもっと便利に使ってみませんか。
  1. あなたにマッチした記事をお届けします
    ユーザーやタグをフォローすることで、あなたが興味を持つ技術分野の情報をまとめてキャッチアップできます
  2. 便利な情報をあとで効率的に読み返せます
    気に入った記事を「ストック」することで、あとからすぐに検索できます
ユーザーは見つかりませんでした