Транспортный уровень Android , а также все соединение между вашим сервером, бэкэндами FCM и клиентскими устройствами, защищены с помощью протокола Transport Layer Security (TLS) . Это обеспечивает надежное сквозное шифрование всех данных во время их передачи, защищая от перехвата в сети. Эта надежная модель безопасности подходит для подавляющего большинства приложений. Более подробную информацию можно найти в документации по архитектуре FCM .
Одним из ограничений сквозного шифрования является то, что оно не шифрует весь путь передачи, и расшифровать сообщение могут только отправитель и получатель. Именно поэтому FCM рекомендует использовать сквозное шифрование для конфиденциальных сообщений, таких как сообщения в чате или транзакции аутентификации. Чтобы получить максимальную отдачу от сквозного шифрования, его необходимо реализовать на более высоком уровне, например, на серверах и в коде приложения.
Добавьте сквозное шифрование для конфиденциальных данных.
Для приложений, обрабатывающих особо конфиденциальные данные, такие как личные сообщения или персональные учетные данные, можно добавить дополнительный уровень защиты с помощью сквозного шифрования (E2EE) . Этот процесс включает шифрование содержимого сообщения на вашем сервере перед отправкой в FCM и расшифровку внутри вашего приложения на устройстве пользователя. Это работает с сообщениями данных FCM , поскольку стандартные данные уведомлений обрабатываются операционной системой и не могут быть расшифрованы вашим приложением до отображения.
Note that FCM doesn't provide a built-in solution for end-to-end encryption. You are responsible for implementing this security layer within your application. There are external libraries and protocols designed for this purpose, such as Capillary or 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), то только клиентское приложение способно расшифровать зашифрованные данные и получить исходное сообщение.
Альтернативный вариант: получение контента непосредственно с вашего сервера.
If end-to-end encryption isn't suitable for your app, you can instead send empty data messages. These messages act as a signal for the app to fetch the content directly from your servers. This means the sensitive data is only transported between your app and your servers, bypassing FCM for the data transfer.
Недостатком этого метода является потенциальная задержка, вызванная подключением приложения к вашему серверу для получения данных. Когда приложение получает сообщение с данными, у него обычно есть всего несколько секунд, чтобы отобразить уведомление, прежде чем перейти в фоновый режим. Получение данных с вашего сервера может не завершиться в течение этого времени. Успех получения данных зависит от таких факторов, как подключение устройства пользователя к сети.
Therefore, consider user experience alternatives for situations where the data fetch might take too long. For example, you could display a generic notification like "You have a new message" and then update it once the full content is retrieved.