信頼の問題
「ブラウザベースの2FAジェネレーター」を聞いたとき、最初の反応は通常懐疑的です。そして正直に言って、それは正しい直感です。ウェブサイトが二要素認証コードを生成している場合、あなたの秘密鍵がウェブページに触れることになります。それはリスクがあるように感じます。
しかし、「ブラウザベース」は自動的に「安全でない」を意味しません。ツールの構築方法に完全に依存します。いくつかのアプローチは本当に危険です。他はネイティブアプリとほぼ同じくらい安全です。違いは処理がどこで行われるかに起因します。
クライアントサイド vs サーバーサイド
これが重要な違いです。ウェブベースのTOTPツールは、2つの全く異なる方法で動作できます:
サーバーサイド処理は、あなたの秘密鍵がリモートサーバーに送信され、そこでコードが生成され、返送されることを意味します。これは悪いです。あなたの秘密は、他の人のインフラストラクチャに保存または送信されています。サーバー運営者、彼らのセキュリティ対策、その間のすべてのソフトウェアを信頼することになります。
クライアントサイド処理は、すべてがブラウザ内で行われることを意味します。JavaScriptはローカルで実行され、あなたのマシン上でコードを生成し、あなたの秘密鍵はデバイスから離れることはありません。ウェブページは、あなたのコンピューターで実行されるコードの配信メカニズムに過ぎません。
適切に構築されたブラウザTOTPツールは、クライアントサイド処理のみを使用します。あなたの秘密はブラウザのメモリに留まり、コードの計算に使用され、それだけです。どこにも送信されません。
自分で検証する方法
誰の言葉を信じる必要はありません。ブラウザの開発者ツール(ほとんどのブラウザでF12)を開き、Networkタブに移動し、秘密鍵を入力してコードを生成するときに何が起こるかを確認してください。リクエストが送信されなければ、ツールはクライアントサイドです。
インターネットから完全に切断してテストすることもできます。ページを読み込み、オフラインになってから、秘密を入力し、コードを生成します。動作すれば、サーバーに何も送信されていません。
オープンソースツールの場合は、ソースコードを直接読むことができます。TOTPアルゴリズムは短く、十分に文書化されています(RFC 6238に基づいています)。実装が仕様と一致し、データ流出が含まれていないことを確認するのは難しくありません。
Web Crypto API
最新のブラウザにはWeb Crypto APIが含まれています。これは、ブラウザ内でネイティブに実行される組み込みの暗号化関数セットです。これは、ウェブベースのTOTPジェネレーターがサードパーティの暗号化ライブラリに依存する必要がないことを意味します。HTTPS接続でブラウザ自体が使用するのと同じ、実績のある暗号プリミティブを使用できます。
Web Crypto APIはHMAC-SHA1(TOTPが使用するハッシュ関数)を提供し、タイミング攻撃に耐性があるように設計された方法で操作を実行します。これは、ネイティブデスクトップアプリケーションにあるのと同じ水準の暗号化実装です。
ネイティブアプリとのセキュリティトレードオフ
ブラウザツールと専用認証アプリの違いについて率直に述べましょう。
ネイティブアプリが優れている点
**永続的な安全なストレージ。**モバイル認証アプリは、オペレーティングシステムの安全なエンクレイブまたはキーチェーンに秘密を保存します。ブラウザタブは、そのレベルのハードウェア支援保護にアクセスできません。タブを閉じるとデータは消えます(これは実際には一部の文脈では機能ですが、秘密を再入力する必要があることを意味します)。
**分離。**ネイティブアプリは独自のサンドボックスで実行されます。ブラウザタブは、他のタブとブラウザプロセスを共有します。悪意のあるブラウザ拡張機能が理論上、ページコンテンツにアクセスできる可能性があります。これは、TOTPツールに特有のものではなく、あらゆるウェブアプリケーションに当てはまります。
**オフライン利用性。**モバイルアプリは常に開くことができます。ウェブツールは最初に読み込む必要がありますが、多くは最初の読み込み後、サービスワーカーでオフライン使用をサポートしています。
ブラウザツールが優れている点
**インストール不要。**アプリをダウンロードする必要がありません。共有コンピューター、ソフトウェアをインストールできない職場のマシン、または一時的なデバイスを使用している場合に重要です。
**透明性。**ウェブツール(特にオープンソースのもの)では、ブラウザ内で実行されているコードを正確に検査できます。ネイティブアプリはコンパイルされたバイナリです。どちらの場合も開発者を信頼しますが、ウェブアプリの方が監査が容易です。
**使い捨て性。**タブを閉じると、秘密はメモリから消えます。ディスクに何も永続化されず、デバイスが後で侵害されても盗まれるデータベースがありません。一時的または一度限りの使用には、これが本当の利点です。
**クロスプラットフォーム。**ブラウザがあるデバイスならどこでも動作します。互換性の問題も、アプリストアの制限もありません。
ブラウザベースのツールが適している状況
ブラウザTOTPジェネレーターは、日常的な認証アプリを置き換えようとしているわけではありません。異なる隙間を埋めます:
- アプリをインストールできないコンピューターにいて、コードを生成する必要がある
- 2FAを設定していて、特定の認証アプリにコミットする前に、秘密鍵が正しいコードを生成することを確認したい
- 自分のアプリケーションでTOTP統合をテストしている開発者
- スマートフォンの電池が切れて、安全に保存したバックアップ秘密鍵を使ってアカウントにアクセスする必要がある
- TOTPコードの仕組みを確認するための、簡単でコミットなしの方法が欲しい
日常的な主要な2FAニーズには、暗号化バックアップを持つ専用認証アプリが依然として最も実用的な選択です。しかし、クライアントサイドブラウザツールは、上記の状況では優れた選択肢です。
ブラウザベースのTOTPツールで何を探すべきか
評価している場合、重要なのは次の点です:
**クライアントサイドのみ。**コードを生成する際にネットワークリクエストがないこと。開発者ツールでこれを検証してください。
**オープンソース。**コードを読むことができます。他の人が監査できます。バグが公開的に発見され、修正されます。
**最小限の依存関係。**ライブラリが少ないほど、攻撃対象領域が小さくなります。TOTPアルゴリズムは、Web Crypto APIだけで実装できるほどシンプルです。
**アカウントや登録がない。**TOTPツールがアカウント作成を求めた場合、あなたの秘密はおそらくサーバーサイドで保存されています。
**HTTPS。**ページはHTTPSで提供されるべきです。そうでないと、コードが転送中に改ざんされる可能性があります。
実際に試してみる
2fa.zipは、完全にクライアントサイドで実行されるブラウザベースのTOTPジェネレーターです。アカウントなし、サーバー保存なし、オープンソースです。秘密鍵を入力し、コードを取得します。上記の方法を使ってクライアントサイドの主張を自分で検証できます。