Транспортный уровень 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 при передаче данных.
Недостатком этого метода является потенциальная задержка, вызванная подключением приложения к вашему серверу для получения данных. Когда приложение получает сообщение с данными, у него обычно есть всего несколько секунд, чтобы отобразить уведомление, прежде чем перейти в фоновый режим. Получение данных с вашего сервера может не завершиться в течение этого времени. Успех получения данных зависит от таких факторов, как подключение устройства пользователя к сети.
Поэтому следует рассмотреть альтернативные варианты пользовательского интерфейса для ситуаций, когда получение данных может занять слишком много времени. Например, можно отобразить общее уведомление типа «У вас есть новое сообщение», а затем обновить его после получения полного содержимого.