この記事は プライバシー エンジニア、Giles Hogben、ソフトウェア エンジニア、Milinda Perera による Android Developers Blog の記事 "Project Capillary: End-to-end encryption for push messaging, simplified" を元に翻訳・加筆したものです。詳しくは元記事をご覧ください。

Firebase Cloud Messaging(FCM)で通信すれば、それだけで HTTPS を利用できます。FCM サーバー エンドポイントと端末間のチャンネルは、TCP を介した SSL で暗号化されます。ただし、デベロッパーのサーバーとユーザーの端末間でメッセージをエンドツーエンド(E2E)で暗号化するためには、デベロッパーが特別な措置を講じる必要があります。

そのため、ユーザーの端末で生成された鍵を使用して、プッシュ メッセージをエンドツーエンドで暗号化することをおすすめしていますが、従来より、このような E2E の暗号化を実装するには、深い技術的知識と多大な労力が必要でした。そこで、デベロッパーのサーバーとユーザーの Android 端末間でプッシュ メッセージの E2E の暗号化を簡単に実装できるようにする Capillary オープンソース ライブラリを公開しました。

また、最近ロック解除された端末のみで復号化が可能になるメッセージを送信する機能を追加しました。この機能では、ファイルベースの暗号化(FBE)を使用することにより、端末でのメッセージの復号化がサポートされます。暗号化されたメッセージは端末暗号化(DE)ストレージでキャッシュされ、メッセージの復号鍵は Android Keystore に格納されるため、ユーザーの認証が必要になります。これにより、デベロッパーは機密性の高いコンテンツが含まれるメッセージを指定できるようになります。メッセージは、ユーザーが端末をロック解除して復号化を行うまで、キャッシュされた形式で暗号化されたままになります。

このライブラリは次の処理を実行します。
  • KitKat(API レベル 19)以降のすべてのバージョンの Android を対象とした暗号化機能と鍵の管理。
  • 鍵の生成と登録のワークフロー。
  • メッセージの暗号化(サーバー上)と復号化(クライアント上)。
  • メッセージの改変を防止するための整合性保護。
  • 未認証コンテキストで受信され、端末のロック解除後に復号化して表示されるメッセージのキャッシュ。
  • ユーザーがアプリのインストール後に端末のロックを追加またはリセットした場合やアプリのストレージをリセットした場合などのエッジケース。

このライブラリは ECDSA 認証を使った RSA 暗号化と Web Push 暗号化の両方をサポートするため、デベロッパーは、E2E で暗号化された Web Push メッセージをブラウザベースのクライアントに送信するために開発した既存のサーバー側コードを再利用することができます。

このライブラリに加えて、デモアプリ(ついに Google のプライバシー チームまでもが独自の SMS アプリを作成しました)も公開しています。このデモアプリでは、ライブラリを使用して、E2E で暗号化された FCM ペイロードを gRPC ベースのサーバー実装から送信します。

未対応の領域

  • このオープンソース ライブラリとデモアプリは、ピアツーピアのメッセージングと鍵の交換をサポートするように設計されていません。これらはデベロッパー向けに設計され、E2E で暗号化されたプッシュ メッセージをサーバーから 1 つ以上の端末に送信します。デベロッパーのサーバーと配信先端末の間でメッセージを保護できますが、端末間でメッセージを直接保護することはできません。
  • この暗号化はサーバー側の包括的なソリューションではありません。コア暗号化機能は提供されますが、デベロッパーは、サンプルのサーバー側コードの一部(たとえば、メッセージの構成や公開鍵のデータベース ストレージなど)をデベロッパーのアーキテクチャ固有のものに改変する必要があります。

このライブラリとデモの設計および実装方法の技術的な詳細については、こちらをご覧ください。


Reviewed by Yuichi Araki - Developer Relations Team