Nachrichtendaten mit Ende-zu-Ende-Verschlüsselung schützen

Die Android-Transportschicht und die gesamte Verbindung zwischen Ihrem Server, den FCM-Back-Ends und den Clientgeräten sind mit Transport Layer Security (TLS) gesichert. Dies bietet eine starke Punkt-zu-Punkt-Verschlüsselung für alle Daten während der Übertragung und schützt sie so vor dem Abfangen im Netzwerk. Dieses robuste Sicherheitsmodell ist für die meisten Anwendungen geeignet. Weitere Informationen finden Sie in der Dokumentation FCM-Architektur.

Eine der Einschränkungen der Punkt-zu-Punkt-Verschlüsselung besteht darin, dass sie nicht für den gesamten Pfad verschlüsselt ist, sodass nur der Absender und der Empfänger die Nachricht entschlüsseln können. Aus diesem Grund empfiehlt FCM, für datenschutzrelevante Kommunikation wie Chatnachrichten oder Authentifizierungsvorgänge eine Ende-zu-Ende-Verschlüsselung zu verwenden. Damit die Ende-zu-Ende-Verschlüsselung optimal genutzt werden kann, muss sie auf einer höheren Ebene implementiert werden, z. B. auf Ihren Servern und in Ihrem App-Code.

Ende-zu-Ende-Verschlüsselung für sensible Daten hinzufügen

Für Anwendungen, die besonders vertrauliche Daten wie private Nachrichten oder persönliche Anmeldedaten verarbeiten, können Sie mit der Ende-zu-Ende-Verschlüsselung (E2EE) eine zusätzliche Schutzebene hinzufügen. Dazu müssen Sie die Nutzlast der Nachricht auf Ihrem Server verschlüsseln, bevor Sie sie an FCM senden, und sie in Ihrer App auf dem Gerät des Nutzers entschlüsseln. Das funktioniert mit FCM-Datennachrichten, da Standardbenachrichtigungs-Payloads vom Betriebssystem verarbeitet werden und nicht von Ihrer App entschlüsselt werden können, bevor sie angezeigt werden.

FCM bietet keine integrierte Lösung für die Ende-zu-Ende-Verschlüsselung. Sie sind dafür verantwortlich, diese Sicherheitsebene in Ihrer Anwendung zu implementieren. Dafür gibt es externe Bibliotheken und Protokolle wie Capillary oder DTLS.

Konzeptionelles Beispiel

So ändert sich die FCM-data-Nutzlast bei Verwendung von E2EE.

Vor der Verschlüsselung (Standardnutzlast):

    {
      "token": "DEVICE_REGISTRATION_TOKEN",
      "data": {
        "sender": "user123",
        "message_body": "Your 2FA code is 555-123",
        "timestamp": "1661299200"
      }
    }

Nach der Verschlüsselung (E2EE-Nutzlast):

  {
    "token": "DEVICE_REGISTRATION_TOKEN",
    "data": {
      "encrypted_payload": "aG9va2Vk...so much encrypted gibberish...ZW5jcnlwdA=="
    }
  }

Wenn Sie die End-to-End-Verschlüsselung richtig implementiert haben, kann nur die Clientanwendung die verschlüsselte Nutzlast entschlüsseln, um die ursprüngliche Nachricht zu lesen.

Alternative: Inhalte direkt von Ihrem Server abrufen

Wenn die Ende-zu-Ende-Verschlüsselung für Ihre App nicht geeignet ist, können Sie stattdessen leere Datennachrichten senden. Diese Nachrichten dienen als Signal für die App, die Inhalte direkt von Ihren Servern abzurufen. Das bedeutet, dass die sensiblen Daten nur zwischen Ihrer App und Ihren Servern übertragen werden und FCM für die Datenübertragung umgangen wird.

Ein Nachteil dieser Methode ist die mögliche Verzögerung, die dadurch entsteht, dass die App eine Verbindung zu Ihrem Server herstellt, um die Daten abzurufen. Wenn eine App eine Datenmeldung empfängt, hat sie in der Regel nur wenige Sekunden Zeit, eine Benachrichtigung anzuzeigen, bevor sie in den Hintergrund verschoben wird. Das Abrufen von Daten von Ihrem Server wird möglicherweise nicht innerhalb dieses Zeitraums abgeschlossen. Der Erfolg dieses Datenabrufs hängt von Faktoren wie der Geräteverbindung des Nutzers ab.

Daher sollten Sie Nutzererfahrung-Alternativen für Situationen in Betracht ziehen, in denen das Abrufen von Daten zu lange dauern könnte. Sie können beispielsweise eine allgemeine Benachrichtigung wie „Sie haben eine neue Nachricht“ anzeigen und sie dann aktualisieren, sobald der vollständige Inhalt abgerufen wurde.