Protege los datos de tus mensajes con la encriptación de extremo a extremo

La capa de transporte de Android, junto con toda la conexión entre tu servidor, los backends de FCM y los dispositivos cliente, se protege con la seguridad de la capa de transporte (TLS). Esto proporciona una sólida encriptación de extremo a extremo para todos los datos mientras están en tránsito, lo que los protege de ser interceptados en la red. Este sólido modelo de seguridad es adecuado para la gran mayoría de las aplicaciones. Puedes encontrar más detalles en la documentación de la arquitectura de FCM.

Una de las limitaciones de la encriptación punto a punto es que no está encriptada en toda su ruta, en la que solo el remitente y el receptor pueden decodificar el mensaje. Por eso, FCM recomienda usar la encriptación de extremo a extremo para las comunicaciones sensibles a la privacidad, como los mensajes de chat o las transacciones de autenticación. Para aprovechar al máximo el cifrado de extremo a extremo, debe implementarse en un nivel superior, como dentro de los servidores y el código de la app.

Agrega encriptación de extremo a extremo para los datos sensibles

En el caso de las aplicaciones que manejan datos particularmente sensibles, como mensajes privados o credenciales personales, puedes agregar una capa adicional de protección con la encriptación de extremo a extremo (E2EE). El proceso implica encriptar la carga útil del mensaje en tu servidor antes de enviarla a FCM y desencriptarla dentro de tu app en el dispositivo del usuario. Esto funciona con los mensajes de datos de FCM, ya que el sistema operativo controla las cargas útiles de notificación estándar y tu app no puede descifrarlas antes de mostrarlas.

Ten en cuenta que FCM no proporciona una solución integrada para la encriptación de extremo a extremo. Eres responsable de implementar esta capa de seguridad en tu aplicación. Existen bibliotecas y protocolos externos diseñados para este propósito, como Capillary o DTLS.

Ejemplo conceptual

A continuación, se muestra cómo cambia la carga útil de FCM data cuando se usa el E2EE.

Antes de la encriptación (carga útil estándar):

    {
      "token": "DEVICE_REGISTRATION_TOKEN",
      "data": {
        "sender": "user123",
        "message_body": "Your 2FA code is 555-123",
        "timestamp": "1661299200"
      }
    }

Después de la encriptación (carga útil de E2EE):

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

Si implementaste correctamente la encriptación de extremo a extremo, la aplicación cliente es la única parte capaz de desencriptar la carga útil encriptada para revelar el mensaje original.

Alternativa: Recupera contenido directamente desde tu servidor

Si la encriptación de extremo a extremo no es adecuada para tu app, puedes enviar mensajes de datos vacíos. Estos mensajes actúan como un indicador para que la app recupere el contenido directamente de tus servidores. Esto significa que los datos sensibles solo se transportan entre tu app y tus servidores, lo que omite FCM para la transferencia de datos.

Un inconveniente de este método es la posible demora que causa la conexión de la app a tu servidor para recuperar los datos. Cuando una app recibe un mensaje de datos, por lo general, solo tiene unos segundos para mostrar una notificación antes de pasar a segundo plano. Es posible que la recuperación de datos de tu servidor no se complete dentro de este período. El éxito de esta recuperación de datos depende de factores como la conectividad del dispositivo del usuario.

Por lo tanto, considera alternativas para la experiencia del usuario en situaciones en las que la recuperación de datos podría tardar demasiado. Por ejemplo, puedes mostrar una notificación genérica, como "Tienes un mensaje nuevo", y, luego, actualizarla cuando se recupere el contenido completo.