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

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

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

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

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

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

Пример

Ниже описано, как полезная нагрузка FCM data изменяется при использовании сквозного шифрования.

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

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

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

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

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

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

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

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

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