Zabezpieczanie danych wiadomości za pomocą pełnego szyfrowania

Warstwa transportu Androida, a także całe połączenie między 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 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, a tylko nadawca i odbiorca mogą odszyfrować wiadomość. Dlatego FCM zaleca stosowanie pełnego szyfrowania w przypadku komunikacji, w której ważna jest prywatność, np. wiadomości na czacie lub transakcji uwierzytelniania. Aby w pełni wykorzystać potencjał szyfrowania end-to-end, musi ono być zaimplementowane 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 czy dane logowania, 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 wiadomości z danymi FCM, ponieważ standardowe ładunki powiadomień są obsługiwane przez system operacyjny i nie mogą być odszyfrowane przez aplikację przed wyświetleniem.

Pamiętaj, że FCM nie oferuje wbudowanego rozwiązania do pełnego szyfrowania. Odpowiadasz za wdrożenie tej warstwy zabezpieczeń w swojej aplikacji. Istnieją zewnętrzne biblioteki i protokoły przeznaczone do tego celu, takie jak Capillary czy DTLS.

Przykład koncepcyjny

Oto jak zmienia się ładunek FCM data podczas korzystania z szyfrowania 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 szyfrowanie e2e zostało wdrożone prawidłowo, tylko aplikacja kliencka może odszyfrować zaszyfrowany ładunek, aby wyświetlić oryginalną wiadomość.

Alternatywa: pobieranie treści bezpośrednio z serwera

Jeśli szyfrowanie end-to-end nie jest odpowiednie dla Twojej aplikacji, możesz zamiast tego wysyłać puste wiadomości z 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 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. Skuteczność pobierania danych zależy od czynników takich jak łączność urządzenia użytkownika.

Dlatego w sytuacjach, w których pobieranie danych może trwać zbyt długo, rozważ alternatywne rozwiązania dotyczące wrażeń użytkownika. 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.