A camada de transporte do Android, assim como toda a conexão entre seu servidor, back-ends do FCM e dispositivos clientes, é protegida usando o Transport Layer Security (TLS). Isso oferece criptografia ponto a ponto forte para todos os dados enquanto eles estão em trânsito, protegendo-os contra interceptação na rede. Esse modelo de segurança robusto é adequado para a grande maioria dos aplicativos. Confira mais detalhes na documentação da arquitetura do FCM.
Uma das limitações da criptografia ponto a ponto é que ela não é criptografada em todo o caminho, e somente o remetente e o destinatário podem decodificar a mensagem. Por isso, o FCM recomenda usar a criptografia de ponta a ponta para comunicações sensíveis à privacidade, como mensagens de chat ou transações de autenticação. Para aproveitar ao máximo a criptografia de ponta a ponta, ela precisa ser implementada em um nível mais alto, como nos servidores e no código do app.
Adicionar criptografia de ponta a ponta para dados sensíveis
Para aplicativos que processam dados particularmente sensíveis, como mensagens privadas ou credenciais pessoais, você pode adicionar uma camada extra de proteção com criptografia de ponta a ponta (E2EE). O processo envolve criptografar o payload da mensagem no servidor antes de enviá-lo ao FCM e descriptografá-lo no app no dispositivo do usuário. Isso funciona com mensagens de dados FCM, já que os payloads de notificação padrão são processados pelo sistema operacional e não podem ser descriptografados pelo app antes de serem exibidos.
O FCM não oferece uma solução integrada para criptografia de ponta a ponta. Você é responsável por implementar essa camada de segurança no seu aplicativo. Há bibliotecas e protocolos externos projetados para essa finalidade, como Capillary ou DTLS.
Exemplo conceitual
Veja como a carga útil FCM data
muda ao usar a E2EE.
Antes da criptografia (payload padrão):
{
"token": "DEVICE_REGISTRATION_TOKEN",
"data": {
"sender": "user123",
"message_body": "Your 2FA code is 555-123",
"timestamp": "1661299200"
}
}
Após a criptografia (payload da E2EE):
{
"token": "DEVICE_REGISTRATION_TOKEN",
"data": {
"encrypted_payload": "aG9va2Vk...so much encrypted gibberish...ZW5jcnlwdA=="
}
}
Se você implementou a criptografia de ponta a ponta corretamente, o aplicativo cliente é a única parte capaz de descriptografar o payload criptografado para revelar a mensagem original.
Alternativa: buscar conteúdo diretamente do seu servidor
Se a criptografia de ponta a ponta não for adequada para seu app, envie mensagens de dados vazias. Essas mensagens atuam como um sinal para o app buscar o conteúdo diretamente dos seus servidores. Isso significa que os dados sensíveis são transportados apenas entre seu app e seus servidores, ignorando FCM para a transferência de dados.
Uma desvantagem desse método é o possível atraso causado pela conexão do app com seu servidor para recuperar os dados. Quando um app recebe uma mensagem de dados, ele geralmente tem apenas alguns segundos para mostrar uma notificação antes de ser colocado em segundo plano. A busca de dados do seu servidor pode não ser concluída dentro dessa janela. O sucesso dessa busca de dados depende de fatores como a conectividade do dispositivo do usuário.
Portanto, considere alternativas de experiência do usuário para situações em que a busca de dados pode demorar muito. Por exemplo, você pode mostrar uma notificação genérica como "Você tem uma nova mensagem" e atualizá-la quando o conteúdo completo for recuperado.