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

Транспортный уровень 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"
      }
    }

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

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

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

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

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

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

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