認証アプリの 6 桁の数字はどう作られるのか? ワンタイムパスワード(OTP)と二段階認証

読了 7分

銀行のアプリや会社のシステムにログインしていると、パスワードの次にもう一段階が出てきます。認証アプリを開いて、30 秒ごとに変わる 6 桁の数字を入力せよという要求です。ところで、この数字はどこから来るのでしょうか。スマホはサーバーと通信する気配もなく数字を次々と作り出し、機内モードでも問題なく更新されます。この記事では、この 6 桁の数字の正体と、二段階認証が実際に防いでくれるものを、コードなしで整理します。

二段階認証が防いでくれるもの #

パスワードは思ったより頻繁に漏れます。他のサイトから流出したパスワードをそのまま入力してみる攻撃もあれば、偽のログインページにだまされて自分で入力してしまうこともあります。パスワード一つだけで施錠されたアカウントは、その一行が漏れた瞬間に終わりです。

二段階認証は、錠前をもう一つ増やすことではなく、種類の違う錠前 を増やすことです。パスワードは頭の中にある「知っているもの」で、認証アプリの入ったスマホは手に握った「持っているもの」です。攻撃者がパスワードを突き止めても、私のスマホまで手に入れたわけではないので、扉は開きません。二つが同時に破られなければならない構造なので、片方が漏れてもアカウントは持ちこたえます。ちなみに、パスワード確認のあとログイン状態がどう維持されるのかは クッキー・セッション・トークンの話 で別途整理しました。

QR コードを読み取った瞬間に起きていること #

二段階認証を有効にするとき、画面に表示された QR コードを認証アプリで読み取ります。この行為の正体は意外と単純です。一つの秘密の鍵をサーバーとスマホで分け持つこと です。

QR コードの中には、そのアカウント専用に作られた長いランダムな文字列が入っています。サーバーはこの文字列を自分の金庫に保管し、スマホの認証アプリも同じ文字列を受け取って保存します。この瞬間から、世界でこの鍵を知っているのはサーバーと私のスマホの二つだけです。QR コードは、長い文字列を手で打ち込む代わりにカメラで書き写すための手段にすぎず、「コードを入力して登録」を押せば同じ文字列を直接タイピングすることもできます。

だからこの QR コードは、使い捨ての入場券ではなく鍵の原本の複製です。登録画面をスクリーンショットで残しておくと誰でも同じ鍵を持ててしまうので、登録が終わった QR コードの画面は残さないほうが安全です。

6 桁の数字が作られる仕組み #

ここからが本題です。サーバーとスマホは同じ秘密の鍵を持っていて、どちらも時計を持っています。この二つがあれば十分です。

認証アプリは 秘密の鍵と現在時刻 を決まった計算式に入れます。計算結果として出てきた長い値から 6 桁だけを切り出したものが、画面の数字です。サーバーも検証するときに同じことをします。自分の金庫の秘密の鍵と自分の時計の現在時刻を同じ計算式に入れて 6 桁を作り、ユーザーが入力した数字と比較します。同じ材料を同じ式に入れたのだから、答えも同じです。両者が申し合わせたように同じ数字を思い浮かべる秘密がこれです。

時刻は 30 秒単位で区切って使います。10 時 0 分 0 秒から 30 秒間は同じ時刻として扱い、30 秒が過ぎると次の区切りに進みます。数字が 30 秒ごとに変わる理由がここにあります。この方式を時間ベースのワンタイムパスワード、略して TOTP と呼びますが、名前まで覚える必要はありません。一度使ったら捨てる答えを時計で作り出す、という発想だけ覚えておけば十分です。

計算式は一方向にしか動きません。秘密の鍵から 6 桁を作るのは簡単ですが、6 桁を見て秘密の鍵を逆算するのは事実上不可能です。だから誰かが肩越しに今の数字をのぞき見ても、30 秒後の数字はわかりません。

インターネットなしでも動く理由 #

機内モードでも認証アプリの数字が更新されるのを見て、不思議に思ったことがあるかもしれません。仕組みを知れば当然のことです。スマホはサーバーから数字を受け取っているのではなく、自分の中に保存された秘密の鍵と自分の時計で直接計算しています。サーバーも自分の側で別に計算します。二つは通信せず、それぞれ計算して答えを突き合わせる関係です。だからデータ通信のつながらない海外でも、Wi-Fi のない地下でも、認証アプリは動きます。

残る心配は時計です。スマホの時計がサーバーの時計とずれていれば両者の計算結果も違ってくるはずですが、幸いここには余裕があります。サーバーは普通、直前と直後の 30 秒の区切りの答えまで一緒に認めてくれます。時計が 1 分近くずれているのでなければ、認証は通ります。認証アプリの数字が何度も間違っていると言われるとき、スマホの日付と時刻を自動設定に合わせるよう案内されるのは、まさにこの時計合わせが背景です。

SMS 認証と何が違うのか #

ショートメッセージで認証番号を受け取る SMS 認証も、同じ「持っているもの」の確認に見えます。ところが、二つの間には重要な違いがあります。SMS の認証番号はサーバーが作って通信網を経由して 配達される数字 で、認証アプリの数字はスマホの中で 生まれる数字 です。

配達には横取りされる隙が生まれます。代表的な手口が SIM スワップです。攻撃者が通信会社をだまして被害者の電話番号を自分の SIM に移してしまうと、その瞬間から認証メッセージは攻撃者のスマホに配達されます。電話番号は自分の所有物のようでいて、実際には通信会社が管理する設定値なので、その設定が乗っ取られると「持っているもの」の認証も一緒に乗っ取られます。認証アプリにはこの経路自体がありません。秘密の鍵はスマホの外に出ず、数字も配達されないので、電話番号を奪われても 6 桁は作れません。SMS 認証もないよりはずっとましですが、選べるなら認証アプリのほうが一枚上手である理由です。

バックアップコードを控えておくよう言われる理由 #

二段階認証を有効にすると、サービスがバックアップコードをいくつか表示して、安全な場所に保管するよう求めてきます。面倒で飛ばしてしまいがちですが、仕組みを知るとそのまま流すわけにはいきません。秘密の鍵はスマホの中にしかないので、スマホをなくすと鍵も一緒に消えます。パスワードを覚えていても「持っているもの」の段階を通過する手段がなくなり、自分のアカウントに自分が入れない状況になります。

バックアップコードは、このときのための非常用の鍵です。一度使うと消える使い捨てで、認証アプリなしでもその段階を通過させてくれます。スマホと同じ場所に置いては意味がないので、紙に書いて別に保管するか、パスワード管理ツールのようにスマホと運命をともにしない場所に入れておくのがコツです。スマホを買い替えるときも同じです。新しいスマホへ認証アプリを移す手続きを終える前に古いスマホを初期化すると、同じことが起きます。

次の段階、パスキー #

最近ログイン画面でよく見かけるパスキーは、この流れの次の段階です。パスワードなしで、スマホやパソコンに保存された鍵と指紋・顔認証だけでログインする方式で、6 桁を書き写す手間がなく、偽サイトにだまされて入力してしまう数字そのものがありません。まだすべてのサービスが対応しているわけではないので、当分はパスワードと認証アプリの組み合わせが一番現実的な基本になります。

まとめ #

整理するとこうなります。二段階認証は「知っているもの」と「持っているもの」を重ねて、片方が漏れても持ちこたえるようにする仕組みです。QR コードの登録は秘密の鍵をサーバーとスマホで分け持つ手続きで、6 桁の数字はその鍵と現在時刻を両者が同じ計算に入れてそれぞれ得る答えです。通信せずそれぞれ計算するので機内モードでも動き、配達の過程がないので SMS 認証より安全です。次に認証アプリの数字が 30 秒を使い切って切り替わる瞬間、その裏でスマホとサーバーが同じ答えを思い浮かべているという事実を思い出していただければ幸いです。

X