Warstwa transportowa Androida oraz całe połączenie między serwerem, backendami FCM i urządzeniami klienckimi są zabezpieczone za pomocą protokołu Transport Layer Security (TLS). Zapewnia to silne szyfrowanie punkt-punkt wszystkich danych podczas przesyłania, co chroni je przed przechwyceniem w sieci. Ten solidny model zabezpieczeń jest odpowiedni dla większości aplikacji. Więcej informacji znajdziesz w dokumentacji architektury FCM.
Jednym z ograniczeń szyfrowania punkt-punkt jest to, że nie jest ono szyfrowane na całej ścieżce, na której tylko nadawca i odbiorca mogą odszyfrować wiadomość. Dlatego FCM zaleca stosowanie pełnego szyfrowania w przypadku komunikacji wymagającej zachowania prywatności, takiej jak wiadomości na czacie czy transakcje uwierzytelniania. Aby w pełni wykorzystać możliwości pełnego szyfrowania, należy je wdrożyć na wyższym poziomie, np. na serwerach i w kodzie aplikacji.
Dodawanie pełnego szyfrowania danych wrażliwych
W przypadku aplikacji, które przetwarzają szczególnie wrażliwe dane, takie jak wiadomości prywatne czy dane uwierzytelniające, możesz dodać dodatkową warstwę ochrony za pomocą pełnego szyfrowania (E2EE). Proces ten obejmuje szyfrowanie ładunku wiadomości na serwerze przed wysłaniem go do FCM i odszyfrowanie go w aplikacji na urządzeniu użytkownika. Działa to w przypadku wiadomości z danymi FCM, ponieważ standardowe ładunki powiadomień są obsługiwane przez system operacyjny i nie mogą zostać odszyfrowane przez aplikację przed wyświetleniem.
Pamiętaj, że FCM nie udostępnia wbudowanego rozwiązania do pełnego szyfrowania. Odpowiadasz za wdrożenie tej warstwy zabezpieczeń w swojej aplikacji. Służą do tego zewnętrzne biblioteki i protokoły, takie jak Capillary czy DTLS.
Przykład koncepcyjny
Oto jak zmienia się ładunek FCM data podczas korzystania z szyfrowania typu end-to-end.
Przed zaszyfrowaniem (standardowy ładunek):
{
"token": "DEVICE_REGISTRATION_TOKEN",
"data": {
"sender": "user123",
"message_body": "Your 2FA code is 555-123",
"timestamp": "1661299200"
}
}
Po zaszyfrowaniu (ładunek E2EE):
{
"token": "DEVICE_REGISTRATION_TOKEN",
"data": {
"encrypted_payload": "aG9va2Vk...so much encrypted gibberish...ZW5jcnlwdA=="
}
}
Jeśli szyfrowanie E2E zostało prawidłowo wdrożone, aplikacja kliencka jest jedyną stroną, która może odszyfrować zaszyfrowane dane, aby ujawnić oryginalną wiadomość.
Alternatywa: pobieranie treści bezpośrednio z serwera
Jeśli pełne szyfrowanie nie jest odpowiednie dla Twojej aplikacji, możesz zamiast tego wysyłać wiadomości z pustymi danymi. Te wiadomości służą jako sygnał dla aplikacji, aby pobierała treści bezpośrednio z Twoich serwerów. Oznacza to, że dane wrażliwe są przesyłane tylko między aplikacją a Twoimi serwerami, z pominięciem FCM.
Wadą tej metody jest potencjalne opóźnienie spowodowane przez aplikację łączącą się z serwerem w celu pobrania danych. Gdy aplikacja otrzyma wiadomość z danymi, zwykle ma tylko kilka sekund na wyświetlenie powiadomienia, zanim zostanie przeniesiona do działania w tle. Pobieranie danych z serwera może nie zakończyć się w tym oknie. Powodzenie pobierania danych zależy od czynników takich jak połączenie urządzenia użytkownika.
Dlatego rozważ alternatywne rozwiązania, które zapewnią użytkownikom lepsze wrażenia w sytuacjach, gdy pobieranie danych może potrwać zbyt długo. Możesz na przykład wyświetlić ogólne powiadomienie, takie jak „Masz nową wiadomość”, a następnie zaktualizować je po pobraniu pełnej treści.