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