このサイトは、ほんの入り口です

ここにあるのは、だれかが実際に調べ、考え、作ってきたことを集めたメモです。気になったら、ページの下の「参考にした情報源」から、もとの本や記事、それを生み出した人たちに、直接ふれてみてください。このメモには書ききれないおもしろさが、そこにあります。

スマホの アプリに でる ログインの 数字は、どこから くるの?

ログインの数字は、本当に送られてきているのか ── 時計から作る「2つ目の鍵」のしくみ

多要素認証 ── 3種類の要素と、TOTPが時刻と共有の秘密から作るワンタイムパスワード

分野:技術

ログインの とき、スマホの アプリに 出る 数字を うちこむ ことが あります。じつは この 数字は、スマホから サーバーへ おくられて いる わけでは ありません[6]。

では、どうやって あって いるか どうか わかるのでしょう。パスワードを ぬすまれても 入れない わけと、数字が 時計から 作られる わけが わかります。

ログインの途中で、スマホの認証アプリに出た数字を入力することがあります。この数字は、スマホからサーバーへ送られてきたものではありません。スマホとサーバーが、それぞれ自分のところで同じ数字を計算しています[6]。

通信で受け渡さないのに、どうして二つの数字が一致するのでしょうか。パスワードを盗まれても入れない理由と、数字が時計から作られる流れ、指紋やパスキーの位置づけが分かります。

認証アプリに表示されるワンタイムパスワードは、端末からサーバーへ送られて照合されるのではない。端末とサーバーが、同じ秘密と現在の時刻から、それぞれ同じ値を計算する方式(TOTP)である[6]。

通信で運ばない値が、なぜ一致するのか。多要素認証がパスワード漏えいに強い理由、30秒という刻みと時計のずれの扱い、生体情報が「秘密ではない」とされる理由、パスキーが秘密を送らない設計までが分かる。

読み方を切り替えられます。画面の上にある「よみかた」のボタンで、小学校低学年むけ・小学校高学年むけ・中学生むけの3つの書き方に切り替わります。むずかしいと思ったら、いつでもやさしい方に戻ってください。選んだ読み方はブラウザが覚えているので、次に別の記事を開いたときも同じ読み方で始まります。

1. パスワードを ぬすまれたのに、どうして 入れないの?

1. パスワードを知られても、ログインできない場合がある

1. パスワードが漏れても侵入を止める ── 「2つ以上」を組み合わせる意味

だれかが あなたの パスワードを 知って しまった と します。ふつうなら、その人は あなたの ふりを して 入れて しまいます。

でも サービスに「2つ目の かぎ」が かかって いると、パスワードだけでは 入れません。IPAと いう 国の きかんは、パスワードを つかわれても ログインできないので、ふせぐ ききめが あると せつめい して います[2]。アメリカの CISAも、2つ目を 出せない ので しんにゅうを とめられる、と かいて います[3]。

この 2つ目の かぎは、パスワードと ちがう しゅるいで なければ いみが ありません。どんな しゅるいが あるのでしょう。

もし誰かがあなたのIDとパスワードを知ってしまったら、その人は画面の上ではあなたと区別がつきません。パスワードだけの入口は、知られた時点で開いてしまいます。

そこで使われるのが、2つ目の鍵を重ねる方法です。IPAは、IDと1つ目のパスワードが不正に使われてもログインできないので、不正ログインの防止に効果があると説明しています[2]。アメリカのCISAも、多要素認証を有効にした利用者はハッキングされにくく、パスワードが盗まれても2つ目の条件を満たせなければ侵入を止められると説明しています[3]。

ただし、2つ目がパスワードとそっくりの種類だと、一緒に盗まれてしまいそうです。どんな種類の鍵をどう組み合わせるのでしょうか。

パスワードが第三者に知られた場合、パスワードだけの認証では、その第三者と本人をサーバーは区別できない。IPAは、IDと1つ目のパスワードが不正利用されてもログインできないことを、多要素認証が不正ログイン防止に効く理由として挙げている[2]。米国のサイバーセキュリティ・インフラストラクチャセキュリティ庁(CISA)も、MFAを有効にした利用者はハッキングされにくく、パスワードの窃取だけでは2つ目の要件を満たせず侵入を止められるとする[3]。

ただし、2つ目の要素が1つ目と同じ種類の情報であれば、同じ手口でまとめて盗まれうる。そこで「何を組み合わせるか」が問題になる。

2. かぎには、どんな 三つの しゅるいが ある?

2. 「知っている・持っている・自分自身」── 鍵は3種類に分けられる

2. 知識・所持・生体 ── 総務省とNISTが示す3つの要素

かぎの しゅるいは、三つに わけられます[1]。

一つ目は「知って いる もの」。パスワードが そうです。二つ目は「持って いる もの」。スマホなどです。三つ目は「自分 じしんに ついて の もの」。しもんや 顔など です。

この うち 二つ いじょうを つかう のが、たようそ にんしょう です。パスワードと しもんを 重ねても いいし、パスワードと スマホでも いいのです。アメリカの NISTと いう きかんも、ちがう しゅるいの かぎを 二つ 出す ことを もとめて います[4]。

では「持って いる もの」の スマホは、どうやって 数字を 出して いるのでしょう。

総務省の説明では、認証に使えるものは3種類に分けられます[1]。

1つ目は「知っているもの」で、パスワードが代表です(知識要素)。2つ目は「持っているもの」で、スマホなどです(所持要素)。3つ目は「本人自身に関するもの」で、指紋、静脈、顔、虹彩などです(生体要素)。このうち2つ以上を使うのが多要素認証です。パスワードと指紋でも、パスワードとスマホでも成り立ちます。

アメリカの標準を定めるNISTも、2つの異なる認証要素を持っていて管理していることの証明を求める方式を、多要素の認証と位置づけています[4]。「パスワードを2回入れる」だけでは、同じ種類を重ねたことになって、多要素とは呼ばれません。

「持っているもの」のスマホは、どのように数字を出しているのでしょうか。

多要素認証の「要素」は、総務省の整理では、知っているもの(知識要素。例:パスワード)、持っているもの(所持要素。例:スマホ)、本人自身に関するもの(生体要素。例:指紋・静脈・顔・虹彩)の3つである[1]。このうち2つ以上を使う認証が多要素認証であり、パスワードを2回続けて入力するだけの方式は、同じ種類の要素の繰り返しなので、これには当たらない。

NIST SP 800-63Bも、同じ3種(something you know / have / are)を前提に、AAL2では、異なる2つの認証要素の所持と管理を、安全な認証プロトコルで証明させることを求めている[4]。では、所持要素であるスマホは、どのようにして数字を出しているのか。

3. 数字は、どこから やって くるの?

3. 数字は送られていない ── スマホとサーバーが時計から同じ数字を作る

3. HOTPからTOTPへ ── 回数の代わりに時刻を使う

アプリの 数字は、ネットを とおって スマホに とどいて いるのでは ありません。スマホの 中で 作られて います。

スマホと サーバーは、はじめに おなじ「ひみつ」を わけあって おきます。あとは、ひみつと 時計の 時間を 使って、どちらも 自分で 数字を 計算します。ふたりが おなじ 本を 持って いて、「今の ページの 数字」を それぞれ 読む ような ものです。ただし 本当は、本では なく けいさんです。

数字を おくるのは、ログインで 自分が うちこむ ときだけです[6]。

時間を 使うので、数字は 30びょうくらいで かわります[6]。でも、スマホの 時計が ずれたら どうなるのでしょう。

認証アプリの数字は、インターネットを通ってスマホに届くのではありません。スマホの中で計算されています。

その元になったのが、2005年12月に決められたHOTPという方式です。HMACというしくみを使い、使い捨てのパスワードを作ります。「知っているもの」と「持っているもの(トークン)」の2つで認証できるようにする目的で定められました。HOTPは、使った回数(カウンター)を材料にします[5]。

2011年5月のTOTPは、この回数の代わりに時刻を使います。現在のUNIX時間(1970年1月1日から数えた経過時間)から、決めた基準の時刻を引き、30秒などの刻みで割った値が、HOTPの材料になります。スマホとサーバーは同じ秘密(または、そこから作れる秘密)を前もって持ち、それぞれが同じ式で計算して値を照らし合わせます[6]。

通信で運ぶのは、ログインのときに自分が入力する数字だけです。たとえば30秒の刻みなら、1日は86400÷30=2880の刻みになり、同じ秘密から1日に2880通りの値が作れます。数字が刻みごとに変わるので、前の数字を盗み見られても、次の刻みでは使えません。では、スマホの時計が少しずれていたらどうなるのでしょうか。

HOTP(RFC 4226、2005年12月)は、HMACにもとづいて使い捨てのパスワードを作る方式で、カウンター(使用回数)を入力に使う。知識と所持(トークン)の2要素による認証を可能にする目的で規定された[5]。ところが回数を使う方式では、端末とサーバーが数える回数がずれると照合できない。そこでTOTP(RFC 6238、2011年5月)は、回数の代わりに時刻から求めた値を使う。T=(現在のUNIX時間−T0)÷X を計算し、その値を HOTP(K,T) に入れる[6]。Xは時間の刻みで、既定値としては30秒が推奨されている。

この方式の要点は、証明する側(端末)と確かめる側(サーバー)が、同じ秘密か、そこから共有の秘密を作れる知識を持つことである。値そのものは通信に載らず、双方が秘密と時刻から計算した結果を照らし合わせる[6]。通信に載るのは、利用者がログイン時に入力する数字だけだ。30秒の刻みなら1日は86400÷30=2880刻みで、同じ秘密から1日に2880通りの値ができる。ただし値の取りうる範囲は桁数で決まるため、偶然の一致の確率は桁数によって決まる。RFCは、30秒を安全さと使いやすさのつり合いで選んだ値としている[6]。では、端末の時計が少しずれたとき、サーバーはどう扱うのか。

4. スマホの 時計が ずれたら、どうなるの?

4. 時計が少しずれても、ログインできるのはなぜか

4. 時計のずれと通信の遅れ ── 受けつける刻みの幅

スマホの 時計は、少し ずれる ことが あります。それでも ログインできるのは、サーバーが 少しだけ ゆとりを もって いるからです。

RFCという きまりでは、ネットで つたわる おくれ ぶんとして、いちばん多くても 1回ぶん ずれた 数字まで 受けつけるのが よい、と すすめて います[6]。ずれが ずっと つづく なら、その ずれを おぼえて 次から つかって もよいと されて います。

この ゆとりを 大きく しすぎると あぶなく なります。30びょうは、あんぜんさと つかいやすさの ちょうどよい ところ として えらばれた ものです。

ところで、三つ目の かぎ「しもん」や「顔」は、どうなのでしょう。

スマホの時計は、わずかにずれることがあります。サーバー側の時計とぴったり合っていなくても使えるようにするため、RFCは、確かめる側が通信の遅れの分として、最大でも1刻みだけずれた値まで受けつけることを推奨しています[6]。たとえば30秒の刻みなら、ずれの上限は30秒ぶんです。前の刻みだけでなく後ろの刻みも許す実装もあります。ずれが続くようなら、そのずれを記録して次回以降の判定に反映してもよい、とされています。

受けつける幅を広げると、使える数字が増えて、攻撃する側にも有利になります。30秒という標準の刻みは、RFCによると安全さと使いやすさのつり合いで選ばれた値です[6]。

ここまでは「持っているもの」の話でした。では、「自分自身」の指紋や顔は、どのように位置づけられているのでしょうか。

端末の時計は個体ごとにずれうるし、入力にも時間がかかる。そのため確かめる側は、通信の遅れとして最大1刻みまでずれた値を受けつけることがRFC 6238で推奨されている。確かめる側がずれを記録し、次回以降の判定に反映してもよい[6]。刻みが30秒なら、許されるずれは最大30秒分という目安になる。

たとえば実装が「前後1刻みまで」を許すなら、サーバーが同時に正しいと認める値は、今の刻み・1つ前・1つ後の最大3つになる(この数え方は、上の推奨から筆者が計算したもの)。許す幅を広げるほど、有効な値の数が増え、攻撃側の当てずっぽうが通る機会も増える。逆に狭すぎると、正しい利用者が何度も弾かれる。標準の30秒は、この両方を比べて選ばれたとされる[6]。残るのは、三つ目の要素である生体情報を、なぜ単独では使わせないのかという問いである。

5. しもんや 顔は、どうして ひとりでは 使わないの?

5. 指紋や顔は「秘密ではない」── 持ち物とセットで使う理由

5. 生体特徴は秘密ではない ── NISTが単独利用を認めない理由

しもんや 顔は、わすれる ことが ありません。でも「ひみつ」では ない、という 考えが あります。

NISTは、顔の 写真などは、ネットや カメラで、本人が 知らない うちに 手に入る ことが ある、と 書いて います[4]。パスワードは 自分の 頭の 中に ありますが、顔は 外から 見えて しまいます。

だから NISTは、生体は 持ち物と いっしょに 使う ときだけに する ように、と して います[4]。「生体は あぶない」の ではなく、「ひとりでは 使わせない」と いう ことです。

では、2つ目の かぎは、どれでも 同じ くらい 強いのでしょうか。

指紋や顔は、忘れたり落としたりしないので、便利で安全そうに思えます。しかしNISTは、生体特徴は秘密ではないと書いています。顔写真はオンラインで見つかったり、カメラ付きのスマホで本人の知らない間に撮られたりすることがあるからです[4]。

パスワードは本人の頭の中にありますが、顔は外に出ています。そこでNISTは、生体を単独では使わせず、物理的な認証器(持ち物)とあわせた多要素認証の一部としてだけ使うよう求めています[4]。

これは「生体認証は危ない」という意味ではなく、「単独の鍵にはしない」という扱いです。実際、スマホのロックを指紋で開けるとき、指紋は「そのスマホを持っていること」とセットで使われています。

2つ目の鍵として使えるものは何種類もあります。どれがどのくらい効いたのでしょうか。

生体特徴は、パスワードと違って秘密ではない。NIST SP 800-63Bは、顔写真がオンラインで得られたり、カメラ付き携帯で本人の知らない間に撮られたりしうることを理由に挙げ、生体を物理的な認証器と組み合わせた多要素認証の一部としてのみ使うべきだとする[4]。

これは生体認証を危険とみなす立場ではなく、単独の要素にしないという位置づけである。たとえば端末のロックを指紋で解除する場合、指紋は端末という所持要素とセットで機能している。注意したいのは、「生体は使わない」という意味に読まないことだ。次に、2つ目の要素の種類によって防ぎ方がどう違うのかを、1つの研究で比べる。

6. 2つ目の かぎで、どれくらい ふせげた?

6. SMSの数字と、端末の確認画面と、セキュリティキーを比べる

6. 2つ目の要素の種類で効き目はどう違うか ── Googleの1年間の研究

2019年、Googleなどの 人たちが、一年かけて しらべた 研究を はっぴょう しました。Googleの アカウントでの 話です[7]。

電話の 番号に おくる 数字(SMS)は、じどうの ぼっと こうげきを 100%、たくさんの 人に まとめて おくる にせの メールを 96%、ねらいうちの こうげきを 76% ふせぎました。スマホの 画面で「あなたですか?」と 聞く やりかたは、100%、99%、90% でした。

せきゅりてぃ きーだけを 使った 人では、調べた あいだ、ねらいうちの にせの メールで やられた 人は いませんでした[7]。

ただし これは ふせげた わりあいで、どんな こうげきも 100%と いう いみでは ありません。NISTは、電話を 使う たしかめかたは「せいげん つき」で 使うもの としていて、だめ という わけでは ありません[4]。

Google、ニューヨーク大学(NYU)、カリフォルニア大学サンディエゴ校(UCSD)による1年間の研究(2019年5月公表)では、2つ目の鍵の種類によって、防げた割合が違いました。これはGoogleアカウントでの調査で、「防いだ割合」の話です[7]。

回復用の電話番号に届くSMSコードは、自動ボットを100%、大量のフィッシングを96%、標的型の攻撃を76%防ぎました。端末上の確認(プロンプト)は、順に100%、99%、90%でした。セキュリティキーだけを使っている利用者は、調査期間中、標的型フィッシングの被害者がゼロでした[7]。

同じ「2つ目」でも、SMSは標的型で76%、端末の確認は90%と差があります。NISTも、電話回線を使った別経路の確認(SMSなど)を「制限つき」の扱いとし、脅威の変化に応じて見直しうるとしています。禁止ではなく、条件つきで使うということです[4]。

ここまでの鍵は、どれも「何かを入力して送る」ものでした。送らずに済む方法はあるのでしょうか。

Google・NYU・UCSDによる1年間の研究(2019年5月公表)は、Googleアカウントを対象に、2つ目の要素の種類ごとに防げた割合を比べた[7]。回復用の電話番号に届くSMSコードは、自動ボット100%、大量フィッシング96%、標的型76%を防いだ。端末上のプロンプトは同じ順に100%、99%、90%である。セキュリティキーのみを使う利用者では、調査期間中に標的型フィッシングの被害者はいなかった[7]。

読み方には注意が要る。これはGoogleのアカウントでの観測で、「防いだ割合」であり、どの攻撃にも100%効くという意味ではない。標的型でSMSが76%、プロンプトが90%と差が出た点は、2つ目の要素の種類によって効き目が違うことを示す。NISTがPSTNを使った別経路確認(SMS等)を「制限つき(RESTRICTED)」とし、脅威の変化に応じて見直しうるとしているのも、この違いと整合する。ただし禁止ではない[4]。

3つの数字を同じ向きにそろえて読むと、標的型での防御率は76%→90%と上がり、セキュリティキーでは調査期間中の被害者が0だった。この研究の範囲では、標的型に対してSMSよりも端末上の確認のほうが防いだ割合が高く、セキュリティキーのみの利用者には被害者がいなかった。これらの方式は、いずれも利用者が値を入力するか承認する点で共通する。では、値そのものを送らない設計は可能か。

7. パスワードを 送らない やりかたは ある?

7. 秘密を送らないパスキーは、何を送っているのか

7. パスキー ── 公開鍵暗号と、サーバーが受け取る「確認成功」の保証

「パスキー」は、パスワードの かわりに なる しくみです。FIDOと いう きまりで、スマホや せきゅりてぃ きーに 入って います[8]。

こうかいかぎ あんごうと いう しくみを つかいます。顔や しもんで 本人か どうかを たしかめる のは、スマホの 中だけ。その データは サーバーには おくられません。サーバーが うけとるのは、「たしかめは せいこうしました」という しょうめいだけです[8]。

三つの かぎの うち、「持って いる もの」と「自分 じしん」を、ひみつを 送らずに 重ねて いる ようすです。

パスキーは、FIDOという標準にもとづく認証の方式です。認証情報は端末やセキュリティキーに保存されます[8]。

公開鍵暗号を使うので、サーバーに渡すのは「本人だけが作れる署名」で、パスワードのような秘密そのものではありません。また、指紋や顔の情報は端末の中に残り、サーバーには送られません。サーバーが受け取るのは、端末で本人確認がうまくいったことを示す情報だけです[8]。

ここまでの話を3つの鍵に当てはめると、パスキーは、端末(持っているもの)と、端末の中での本人確認(指紋や顔などの生体、またはPINなど)を、秘密を送らずに組み合わせる方法といえます。

パスキーは、FIDO標準にもとづく認証情報で、端末やセキュリティキーに保存される。公開鍵暗号を用いるため、サーバー側に残るのは検証用の情報で、利用者の秘密そのものを送る設計ではない。生体情報と、その処理は端末内にとどまり、リモートのサーバーには送られない。サーバーが受け取るのは、生体確認が成功したという保証だけである[8]。生体の代わりにPINなどで端末内の本人確認を行う場合もある。

前の章の用語で整理すると、端末は所持要素、端末内での本人確認(生体確認の場合は生体要素)は本人側の要素であり、NISTが示した「生体は持ち物とセットで使う」という考え方と、構造が一致する。ただしここでの対応づけは、資料の記述を並べて読んだ筆者の整理である。

8. 自分の 2つ目の かぎを、さがして みよう

8. 設定画面で「2つ目の鍵」を探して、3種類に分けてみる

8. 設定画面の確認と、30秒の刻みを自分の時計で測る

家の人と いっしょに、よく 使う サービスの せってい がめんを 見て みましょう。「2だんかい にんしょう」や「パスキー」と 書いて あるでしょうか。見る だけで、かえなくて かまいません。

あったら、その 2つ目の かぎは「知って いる もの」「持って いる もの」「自分 じしん」の どれか、考えて みましょう。

アプリの 数字を 使って いる 人は、数字が かわるまでを 時計で はかって みましょう。30びょうくらいで かわるか、見て みましょう。数字は 人に 見せては いけません。

家の人と一緒に、よく使うサービスの設定画面で「2段階認証」や「パスキー」の項目を探してみましょう。見るだけで、設定は変えなくて構いません。

見つけたら、その2つ目の鍵は、知っているもの・持っているもの・自分自身のどれにあたるかを考えます。同じサービスでも、SMSと認証アプリでは、鍵の種類は同じ「持っているもの」でも、数字が作られる場所が違います。

認証アプリを使っている人は、数字が変わるまでの時間を時計で測ってみましょう。30秒前後で切り替わるか、画面を見ながら確かめられます。数字は他の人に見せないようにしてください。

知りたくなったときは、総務省の国民のためのサイバーセキュリティサイト[1]が日本語で読めます。英語の原文も読みたい人は、TOTPの原文のRFC 6238[6]へ進めます。

よく使うサービスの設定で、2段階認証やパスキーの有無を確認し(家の人と一緒に。設定の変更は不要)、2つ目の要素を知識・所持・生体のどれに分類できるか考えてみるとよい。認証アプリを使っている場合は、表示が切り替わるまでの時間を時計で測り、30秒前後かどうかを確かめられる。数字は他人に見せない。

さらに調べるなら、定義は総務省のページ[1]とNIST SP 800-63B[4]、値の作り方はRFC 4226[5]とRFC 6238[6]、パスキーはFIDO Allianceの解説[8]が一次に近い資料になる(海外の資料は英語)。

しらべた もとの じょうほう

参考にした情報源

参考にした情報源と、その使い方

出典について:公的機関の説明、国際規格の文書、企業の研究発表、業界団体の解説を使った。何に使ったかは、それぞれの項目の最後に書いている。

  1. 総務省 国民のためのサイバーセキュリティサイト「多要素認証」。https://www.soumu.go.jp/main_sosiki/cybersecurity/kokumin/security/end_user/general/01/ (3つの要素の分け方について)
  2. IPA「不正ログイン対策特集ページ」。https://www.ipa.go.jp/security/anshin/measures/account_security.html (多要素認証が不正ログインの防止に効く理由について)
  3. CISA「More than a Password」。https://www.cisa.gov/MFA (多要素認証を有効にした利用者への効果について。英語)
  4. NIST「SP 800-63B」。https://pages.nist.gov/800-63-3/sp800-63b.html (多要素の定義、生体特徴の扱い、電話回線を使う確認の扱いについて。英語)
  5. IETF「RFC 4226 HOTP」。https://datatracker.ietf.org/doc/html/rfc4226 (回数をもとにした使い捨てパスワードについて。英語)
  6. IETF「RFC 6238 TOTP」。https://datatracker.ietf.org/doc/html/rfc6238 (時刻をもとにした値の作り方、30秒の刻み、時計のずれの扱いについて。英語)
  7. Google Security Blog「New research: How effective is basic account hygiene at preventing hijacking」(2019年5月17日)。https://security.googleblog.com/2019/05/new-research-how-effective-is-basic.html (2つ目の要素の種類ごとに防いだ割合について。英語)
  8. FIDO Alliance「Passkeys」。https://fidoalliance.org/passkeys/ (パスキーの保存先と生体情報の扱いについて。英語)

なおした ところ

更新履歴

更新履歴(改版の記録)

  •  初版を公開。

このサイトでは、公開した記事の本文は原則として書き直しません。誤りが見つかったときや、内容が古くなったときだけ手を入れ、その理由をこの欄に残します。