Android トランスポート レイヤと、サーバー、FCM バックエンド、クライアント デバイス間の接続全体は、Transport Layer Security(TLS)を使用して保護されます。これにより、転送中のすべてのデータに対して強力なポイントツーポイント暗号化が提供され、ネットワーク上で傍受されるのを防ぐことができます。この堅牢なセキュリティ モデルは、ほとんどのアプリケーションに適しています。詳細については、FCM アーキテクチャのドキュメントをご覧ください。
ポイント ツー ポイントの暗号化の制限の 1 つは、送信者と受信者のみがメッセージを復号できるパス全体で暗号化されないことです。そのため、FCM では、チャット メッセージや認証トランザクションなどのプライバシーに関わる通信にはエンドツーエンドの暗号化を使用することをおすすめしています。エンドツーエンド暗号化を最大限に活用するには、サーバーやアプリコードなどの上位レベルで実装する必要があります。
機密データのエンドツーエンド暗号化を追加する
プライベート メッセージや個人認証情報など、特に機密性の高いデータを扱うアプリでは、エンドツーエンドの暗号化(E2EE)で保護レイヤを追加できます。このプロセスでは、サーバーでメッセージ ペイロードを暗号化してから FCM に送信し、ユーザーのデバイス上のアプリ内で復号します。これは FCM データ メッセージで機能します。標準の通知ペイロードはオペレーティング システムによって処理され、表示前にアプリで復号することはできません。
なお、FCM にはエンドツーエンドの暗号化のための組み込みソリューションはありません。このセキュリティ レイヤをアプリケーション内に実装するのは、ユーザーの責任です。この目的のために設計された外部ライブラリとプロトコル(Capillary や DTLS など)があります。
概念例
E2EE を使用する場合の FCM data
ペイロードの変更は次のとおりです。
暗号化前(標準ペイロード):
{
"token": "DEVICE_REGISTRATION_TOKEN",
"data": {
"sender": "user123",
"message_body": "Your 2FA code is 555-123",
"timestamp": "1661299200"
}
}
暗号化後(E2EE ペイロード):
{
"token": "DEVICE_REGISTRATION_TOKEN",
"data": {
"encrypted_payload": "aG9va2Vk...so much encrypted gibberish...ZW5jcnlwdA=="
}
}
エンドツーエンド暗号化が正しく実装されていれば、暗号化されたペイロードを復号して元のメッセージを表示できるのはクライアント アプリケーションだけです。
代替方法: サーバーからコンテンツを直接取得する
エンドツーエンドの暗号化がアプリに適していない場合は、代わりに空のデータ メッセージを送信できます。これらのメッセージは、アプリがサーバーからコンテンツを直接取得するためのシグナルとして機能します。つまり、機密データはアプリとサーバーの間でのみ転送され、データ転送のための FCM はバイパスされます。
この方法の欠点は、アプリがサーバーに接続してデータを取得する際に遅延が発生する可能性があることです。アプリがデータ メッセージを受信すると、通常はバックグラウンドに移行する前に通知を表示するのに数秒しかかかりません。サーバーからのデータの取得がこの期間内に完了しない可能性があります。このデータ取得の成否は、ユーザーのデバイスの接続性などの要因に左右されます。
そのため、データ取得に時間がかかりすぎる可能性がある状況では、ユーザー エクスペリエンスの代替手段を検討してください。たとえば、「新しいメッセージがあります」のような一般的な通知を表示し、コンテンツ全体を取得したら更新できます。