Защитите данные ваших сообщений с помощью сквозного шифрования

Транспортный уровень Android , а также все соединение между вашим сервером, бэкэндами FCM и клиентскими устройствами, защищены с помощью протокола Transport Layer Security (TLS) . Это обеспечивает надежное сквозное шифрование всех данных во время их передачи, защищая от перехвата в сети. Эта надежная модель безопасности подходит для подавляющего большинства приложений. Более подробную информацию можно найти в документации по архитектуре FCM .

Одним из ограничений сквозного шифрования является то, что оно не шифрует весь путь передачи, и расшифровать сообщение могут только отправитель и получатель. Именно поэтому FCM рекомендует использовать сквозное шифрование для конфиденциальных сообщений, таких как сообщения в чате или транзакции аутентификации. Чтобы получить максимальную отдачу от сквозного шифрования, его необходимо реализовать на более высоком уровне, например, на серверах и в коде приложения.

Добавьте сквозное шифрование для конфиденциальных данных.

Для приложений, обрабатывающих особо конфиденциальные данные, такие как личные сообщения или персональные учетные данные, можно добавить дополнительный уровень защиты с помощью сквозного шифрования (E2EE) . Этот процесс включает шифрование содержимого сообщения на вашем сервере перед отправкой в FCM и расшифровку внутри вашего приложения на устройстве пользователя. Это работает с сообщениями данных FCM , поскольку стандартные данные уведомлений обрабатываются операционной системой и не могут быть расшифрованы вашим приложением до отображения.

Обратите внимание, что FCM не предоставляет встроенного решения для сквозного шифрования. Вы несете ответственность за реализацию этого уровня безопасности в своем приложении. Для этой цели существуют внешние библиотеки и протоколы, такие как Capillary или DTLS .

Концептуальный пример

Вот как изменяется полезная нагрузка data FCM при использовании сквозного шифрования (E2EE).

Перед шифрованием (стандартная полезная нагрузка):

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

После шифрования (сквозная полезная нагрузка):

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

Если вы правильно реализовали сквозное шифрование (e2e), то только клиентское приложение способно расшифровать зашифрованные данные и получить исходное сообщение.

Альтернативный вариант: получение контента непосредственно с вашего сервера.

Если сквозное шифрование не подходит для вашего приложения, вы можете вместо этого отправлять пустые сообщения с данными. Эти сообщения служат сигналом для приложения, чтобы оно получило контент непосредственно с ваших серверов. Это означает, что конфиденциальные данные передаются только между вашим приложением и вашими серверами, минуя FCM при передаче данных.

Недостатком этого метода является потенциальная задержка, вызванная подключением приложения к вашему серверу для получения данных. Когда приложение получает сообщение с данными, у него обычно есть всего несколько секунд, чтобы отобразить уведомление, прежде чем перейти в фоновый режим. Получение данных с вашего сервера может не завершиться в течение этого времени. Успех получения данных зависит от таких факторов, как подключение устройства пользователя к сети.

Поэтому следует рассмотреть альтернативные варианты пользовательского интерфейса для ситуаций, когда получение данных может занять слишком много времени. Например, можно отобразить общее уведомление типа «У вас есть новое сообщение», а затем обновить его после получения полного содержимого.