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 wrażliwej na prywatność , takiej jak wiadomości na czacie czy transakcje uwierzytelniające. 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 dane wrażliwe, takie jak wiadomości prywatne czy 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 udostępnia wbudowanego rozwiązania do pełnego szyfrowania. Odpowiadasz za zaimplementowanie tej warstwy zabezpieczeń w swojej aplikacji. Istnieją zewnętrzne biblioteki i protokoły zaprojektowane w tym celu, takie jak Capillary czy DTLS.
Przykład koncepcyjny
Oto jak zmienia się ładunek FCM data podczas korzystania z E2EE.
Przed szyfrowaniem (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 Twoją aplikacją a serwerami, z pominięciem FCM
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ą wygodę użytkowników 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.