Warstwa transportowa Androida oraz całe połączenie między Twoim serwerem, backendami FCM i urządzeniami klienckimi są zabezpieczone za pomocą protokołu TLS. Zapewnia to silne szyfrowanie typu punkt-punkt wszystkich danych podczas przesyłania, chroniąc je przed przechwyceniem w sieci. Ten solidny model zabezpieczeń jest odpowiedni dla zdecydowanej większości aplikacji. Więcej informacji znajdziesz w dokumentacji architektury FCM.
Jednym z ograniczeń szyfrowania typu punkt-punkt jest to, że nie jest ono szyfrowane na całej ścieżce, a 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ć pełne szyfrowanie, należy je zaimplementować na wyższym poziomie, np. w kodzie serwerów i aplikacji.
Dodawanie pełnego szyfrowania danych wrażliwych
W przypadku aplikacji obsługujących szczególnie wrażliwe dane, takie jak wiadomości prywatne lub dane osobowe, możesz dodać dodatkową warstwę ochrony za pomocą pełnego szyfrowania (E2EE). Proces ten polega na zaszyfrowaniu ładunku wiadomości na serwerze przed wysłaniem go do FCM i odszyfrowaniu go w aplikacji na urządzeniu użytkownika. Działa to w przypadku FCM wiadomości z danymi, ponieważ standardowe powiadomienia ładunki są obsługiwane przez system operacyjny i nie mogą zostać odszyfrowane przez aplikację przed wyświetleniem.
Pamiętaj, że FCM nie zapewnia wbudowanego rozwiązania do pełnego szyfrowania. Odpowiadasz za wdrożenie tej warstwy zabezpieczeń w swojej aplikacji. Istnieją zewnętrzne biblioteki i protokoły zaprojektowane do tego celu, takie jak Capillary czy DTLS.
Przykład koncepcyjny
Oto jak zmienia się ładunek FCM data podczas korzystania z E2EE.
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 prawidłowo zaimplementujesz szyfrowanie e2e, tylko aplikacja kliencka będzie mogła odszyfrować zaszyfrowany ładunek, aby odsłonić 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ć puste wiadomości z danymi. Te wiadomości działają jako sygnał dla aplikacji, aby pobrać treści bezpośrednio z Twoich serwerów. Oznacza to, że dane wrażliwe są przesyłane tylko między aplikacją a serwerami, a FCM jest pomijany w przypadku przesyłania danych.
Wadą tej metody jest potencjalne opóźnienie spowodowane połączeniem aplikacji z serwerem w celu pobrania danych. Gdy aplikacja otrzyma wiadomość z danymi, ma zwykle tylko kilka sekund na wyświetlenie powiadomienia, zanim zostanie przeniesiona do tła. Pobieranie danych z serwera może nie zakończyć się w tym czasie. Powodzenie pobierania danych zależy od takich czynników jak łączność urządzenia użytkownika.
Dlatego rozważ alternatywne rozwiązania, które poprawią komfort użytkownika 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.