2要素認証アプリの仕組み
2022/01/30
- 仕様: RFC6238 (TOTP)
- 認証の流れ
- (スマホアプリ) インストールする
- (サービス側) ログインしたいサービスにログイン
- (サービス側) ログインしたアカウントで2要素認証をオン、アプリ使用に設定
- このとき、サービス稼働サーバで秘密鍵(といってもSSL証明書(SSL証明書だとユーザごとに一意に大量に発行するのは向かない)ではなく、ランダムなbit列)を生成
- この秘密鍵を文字列として含んだQRコードとして画面に表示
- (スマホアプリ) QRコードを読み取り、アプリ内にサーバ側で払い出された秘密鍵をインポート
- (双方) RFC6238, TOTPの仕様に則り、3.~4.の手順でサービスとスマホアプリで共有された秘密鍵と時刻をシード値として暗号学的(可逆計算が現実的な時間内では計算できない)ハッシュ関数を使ってハッシュ値を生成
- ハッシュアルゴリズムにはSHA-1を使用するケースが多い
- (双方) このハッシュ値から、6ケタの数値を生成
- これが6ケタの数字の正体。RFC6238では30秒ごとにリセットが望ましいとされているので、どのアプリも30秒でリセットされるようになっている
- 5.~6.の過程は双方で行われ、シード値となる秘密鍵と現在時刻が同じであれば同じハッシュ値・6桁数値になることが数学的に保証されているため、アプリ側の数字を入力、それをサーバ側では同じ方法で生成した同じ値の6ケタの数値と照合し、合致しているかどうかで認証を行う
という感じですね。