Proton Authenticator は、オープンソースの2要素認証 (2FA) 認証アプリです。デバイス上で時間ベースのワンタイムパスワード (TOTP) コードを生成し、セキュリティの層を追加してオンラインサービスにアクセスできるようにします。Proton エコシステムの他の部分を保護しているのと同じ、十分にテストされた暗号化を使用しています。Proton Authenticator は、プライバシーを保護し、データの完全な所有権をお客様に与えながら、ほぼすべてのプラットフォームで利用できるようにゼロから設計されたという点でユニークです。

他の認証アプリとは異なり、Proton Authenticator は、デバイスの同期を有効にした場合でも、エンドツーエンド暗号化でお客様のデータを保護します。

これは、Proton 自体を含む誰も、お客様がどのアカウントを持っているオンラインサービスを知ることができないことを意味します。この情報は、メールや閲覧履歴と同様にお客様について多くのことを明らかにする可能性があり、プライバシーを維持するためにその保護は不可欠です。

Proton Authenticator のエンドツーエンド暗号化は、鍵の生成やデータの暗号化を含むすべての暗号化操作がお客様のデバイス上でローカルに実行されることを保証します。つまり、暗号化されていないデータに Proton がアクセスしたり、サードパーティと共有したりすることはできません。Proton サーバーは、Proton Account のパスワードを含め、お客様の暗号化されていないデータにアクセスすることは決してありません。

暗号化モデル

Proton Authenticator は、すべてのユーザーデータの最大限のセキュリティとプライバシーを確保するために包括的なアプローチをとっています。すべての暗号化操作はデバイス上でローカルに行われ、サーバーに送信されるデータは常に暗号化されています。Proton はユーザーデータの復号化に必要なプレーンテキストの鍵にアクセスすることはないため、サードパーティから要請されたとしても、保管済みのデータを復号化することは不可能です。

Proton Authenticator は、Proton Mail の認証に使用しているのと同じ高度な暗号化を使用しています。これには、中間者攻撃 (MITM) に対してより強力なセキュリティ保証を提供する、Secure Remote Password (SRP) プロトコルの強化バージョンの使用が含まれます。当社の実装では、Proton とユーザー間のメッセージを検出不可能な方法で任意に既読、変更、遅延、破壊、繰り返し、または偽造できる攻撃者であっても、1回のログイン試行につき1つのパスワード推測を確認することしかできず、直接ログインを試みるのと同等です。このようにして、仮に Proton が侵害され悪意を持って行動したとしても、パスワードに相当する情報が明らかになることはありません。

Proton の認証暗号化について詳しく読む

データ暗号化

Proton Authenticator を使用すると、Proton Account を持っていなくても、2FA コードを安全に保管できます。これは、最初の暗号化プロセスをローカルデバイス上で完全に行う必要があることを意味します。その後、Proton Account を使用してデバイス間でコードを同期したい場合は、Proton サーバーに保管済みの暗号鍵を使用して同期を実行できます。

Proton の暗号化は、認証アプリがユーザーデータの暗号化に使用するルートキーの暗号化バージョンを Proton サーバーが提供することから始まります。各 Proton ユーザーは非対称のユーザーキーを持っており、Proton はこのユーザーキーをお客様のデバイス上で次のように暗号化します。

  • シングルアカウントパスワードを使用するアカウント:Proton は、アカウントパスワードの bcrypt ハッシュとアカウントのソルト化を使用してユーザーキーを暗号化します。
  • 複数アカウントパスワード機能を使用するアカウント:Proton は、キーパスワードの bcrypt ハッシュとアカウントのソルト化を使用してユーザーキーを暗号化します。

Proton Authenticator は bcrypt とアカウントのソルト化を使用してパスワードをハッシュ化し、総当たり攻撃に対する保護層を追加しています。悪意のある攻撃者が Proton のデータベースにアクセスしたとしても、アカウントキーは総当たり攻撃から安全に守られます。

同期を有効にすると、Proton Authenticator は32バイトのランダムな認証キーを生成します。このキーはユーザーキーで暗号化および署名され、お客様だけが復号化できるようにします。誰も(Proton でさえも)新しい認証キーを既読にしたり作成したりすることはできません。認証キーにアクセスできるようになると、Proton Authenticator 内のすべてのエントリは 256-bit AES-GCM を使用して暗号化されます。

Proton Authenticator は Proton Account を必要としないため、デバイス上にのみデータが存在する場合に安全に保管するための別の暗号化スキーマも必要です。結局のところ、これを実装する最も簡単な方法は、Proton Account を別のキープロバイダーとして扱うことです。最終的には次のようになります。

Proton Account なしの Proton Authenticator の暗号化図

デバイス上のローカルキーストレージについては、各システムの安全なキーストレージプロバイダーに依存しています。

  • Android:キーを Android Keystore(新しいウィンドウ) に安全に保管し、それを使用してアプリの保護されたファイルシステムに保管するローカルランダムキーを暗号化します。そのキーは、デバイス上のすべての Proton Authenticator エントリを対称的に暗号化するために使用されます。
  • iOS/iPadOS/macOS:ローカルランダムキーを生成し、Keychain サービス(新しいウィンドウ)に保管します。そのキーは、デバイス上のすべての Proton Authenticator エントリを対称的に暗号化するために使用されます。
  • Windows:ローカルランダムキーを生成し、Windows 資格情報マネージャー(新しいウィンドウ)に保管します。そのキーは、デバイス上のすべての Proton Authenticator エントリを対称的に暗号化するために使用されます。WCM への接続が利用できない場合は、ユーザーがパスワードでローカルランダムキーを暗号化できるようにします。
  • Linux:ローカルランダムキーを生成し、利用可能な DBUS シークレットサービスに保管します。そのキーは、デバイス上のすべての Proton Authenticator エントリを対称的に暗号化するために使用されます。DBUS シークレットサービスが構成されていない場合は、ユーザーがパスワードでローカルランダムキーを暗号化できるようにします。

バックアップ暗号化

Proton Authenticator の主な強みの1つは、常にデータを管理できることです。これには、コードを定期的にローカルデバイスにバックアップし、この機密データを暗号化するパスワードを設定できるようにすることが含まれます。

この安全なローカルバックアップを実装するために、提供されたパスワードを使用して、Argon2 を KDF (鍵導出関数) として使用し、安全な暗号鍵を導出します。KDF は、ユーザーが入力したパスワードなどの秘密の入力から暗号鍵を生成するために使用され、その主な目的は、攻撃者がパスワードを解読するのを困難にし、時間をかけさせることでセキュリティを向上させることです。パスワードから生成されたこの暗号鍵を使用して、すべてのエントリをシリアル化して暗号化し、バックアップが漏洩した場合でもデータが安全に暗号化されたままであることを保証します。また、よく知られたオープンな技術を使用することで、Proton Authenticator を使用せずにデータを復号化できるため、別の認証アプリに移行する場合でも管理権を維持できます。

透明性によるセキュリティ

すべての Proton サービスと同様に、Proton Authenticator はオープンソースです。誰でもソースコードを参照して、セキュリティモデルを検証できます。他のサービスと同様に、Proton Authenticator も定期的な独立したセキュリティ監査を受け、監査レポートが利用可能になり次第、一般に公開します。

最後に、関心のあるセキュリティ研究者のために、Proton Authenticator は Proton のバグバウンティプログラムの対象となっており、Proton のソフトウェアのバグ発見に対して最大10万ドルの報奨金を提供しています。