【投稿者】:たむ
こんにちは、今月の技術ブログ担当たむです。
最近、Google AuthenticatorやMicrosoft Authenticatorなどスマホの認証アプリを使ってログインするサービスが増えてきていますが、これは「TOTP(Time-based One-Time Password)」という技術を用いたMFA(多要素認証)のひとつです。
本日はこのTOTPによるMFA認証について分かりやすく解説します。
- 概要
Webサービスのログインにおいて、IDとパスワードの組み合わせだけでは、情報漏洩やパスワードリスト攻撃による不正アクセスのリスクを完全に防ぐことはできません。そこで重要になるのが、複数の認証要素を組み合わせるMFA(多要素認証)です。
MFAの代表的な認証方式の一つが、Google AuthenticatorやMicrosoft Authenticatorなどのスマホの認証アプリを使ったTOTPです。
TOTPの仕組みは、
・「世界共通の時間(30秒単位)」
・「ユーザーとサービス間で共有された秘密鍵」
という2つの要素で算出された6桁の数値(MFAコード)により認証を行っています。
パスワードそのものをネットワーク上で送受信しないため、通信の盗聴に対して高い耐性を持っています。
また、MFAコードは短時間で無効になるため、仮に第三者に知られた場合でも悪用されるリスクを大幅に低減できます。

- スマホ認証アプリの使用
Google AuthenticatorやMicrosoft AuthenticatorなどのTOTPアプリは、インターネットに接続していなくても、スマホ端末単体で30秒ごとに新しいMFAコードを生成し続けることができます。
なぜなら、スマホ認証アプリにはQRコードから取得した「秘密鍵」が保存されており、この秘密鍵とスマホ端末のシステム時刻を使用してMFAコードを生成するからです。
- 登録手順と仕組み
MFAの初期設定時には、サービス側の画面にQRコードが表示されますのでこれをスマホの認証アプリで読み取ります。QRコードには以下の内容が含まれています。
①TOTPの使用
②サービス(例:AWSなど)
③秘密鍵
これによりサービスと認証アプリの紐づけが完了し、MFAコードが30秒ごとに自動生成されるようになります。

気をつけなくてはいけないのは、スマホのシステム時刻が狂っていると認証に失敗するということです。TOTPの計算は「お互いが同じ正確な時間を見ていること」が前提になっています。
例えば、スマホのシステム時刻が数分でもズレてしまうと、サーバー側が計算する「今の時間」と、スマホが計算する「今の時間」が食い違ってしまいます。その結果、同じ秘密鍵を使っているにもかかわらず全く違うMFAコードが生成されてしまい、「コードが一致しません」というエラーになって認証に失敗してしまいます。
- メリット
①オフライン動作
スマホが通信環境のないオフラインの状態でも、認証アプリでMFAコードが生成されます。
②高い安全性
固定のパスワードが漏洩しても、手元のスマホがなければログインを突破されません。
③高い汎用性
AWSやGitHubなど、多くの主要サービスで共通の規格として採用されています。
- デメリット
①スマホ端末の紛失や故障
スマホの紛失や故障によって手元に端末がない場合、正しいコードを生成できなくなる可能性があります。(※)
②複数スマホ端末の登録
スマホが壊れた時のために、複数台のスマホで同じQRコードを読み込ませて双子状態にしておくという運用は技術的には可能です。しかし、サービス側で制限している場合やセキュリティの窓口が増えるリスクもあるため、サービス側のポリシーを確認した上で慎重に行う必要があります。
(※注)
スマホの紛失や故障の場合でも、AWSなどのサービスでは以下のような救済策が用意されています。(実際に紛失すると結構大変ですが。)
①管理者のリセット代替認証: 組織のアカウントであれば管理者による解除、クラウドのルートアカウント等であれば、登録済みの連絡先情報や本人確認手続きにより、MFAデバイスの再登録やアカウント復旧を行える場合があります。
②最悪はAWSのサポートに問い合わせて本人確認が取れれば、パスワードのリセットや再設定を行うことが可能です。
- まとめ
TOTPによるMFA認証は、「秘密鍵」と「時間」というシンプルかつ強力なセキュリティモデルによって、私たちのアカウントを日々強固に守っています。
一方で、時刻がズレると機能しなくなる繊細さや、「スマホ紛失時のリスク管理」が運用上の重要なポイントになります。仕組みの本質を正しく理解し、バックアップ体制をしっかりと整えた上で、安全で快適なセキュリティ環境を構築していきましょう。
以上、最後までお読みいただきありがとうございました。









