Транспортный уровень Android , а также всё соединение между вашим сервером, бэкендами FCM и клиентскими устройствами, защищены с помощью протокола TLS (Transport Layer Security) . Это обеспечивает надёжное шифрование всех данных по принципу «точка-точка» при их передаче, защищая их от перехвата в сети. Эта надёжная модель безопасности подходит для подавляющего большинства приложений. Подробнее см. в документации по архитектуре 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"
}
}
После шифрования (полезная нагрузка E2EE):
{
"token": "DEVICE_REGISTRATION_TOKEN",
"data": {
"encrypted_payload": "aG9va2Vk...so much encrypted gibberish...ZW5jcnlwdA=="
}
}
Если вы правильно реализовали шифрование e2e, клиентское приложение — единственная сторона, способная расшифровать зашифрованную полезную нагрузку и раскрыть исходное сообщение.
Альтернатива: извлечение контента напрямую с вашего сервера
Если сквозное шифрование не подходит для вашего приложения, вы можете отправлять пустые сообщения с данными. Эти сообщения служат сигналом для приложения, чтобы оно загрузило контент непосредственно с ваших серверов. Это означает, что конфиденциальные данные передаются только между вашим приложением и вашими серверами, минуя FCM .
Недостатком этого метода является потенциальная задержка, вызванная подключением приложения к вашему серверу для получения данных. Когда приложение получает сообщение с данными, у него обычно есть всего несколько секунд, чтобы отобразить уведомление, прежде чем оно перейдет в фоновый режим. Загрузка данных с вашего сервера может не завершиться в течение этого времени. Успешность загрузки данных зависит от таких факторов, как качество подключения устройства пользователя.
Поэтому рассмотрите альтернативные варианты для пользователей, когда получение данных может занять слишком много времени. Например, можно отображать стандартное уведомление типа «У вас новое сообщение», а затем обновлять его после получения полного содержимого.