Diferente de um servidor backend, protegido por firewalls e infraestrutura controlada pela própria empresa, um aplicativo móvel roda inteiramente no dispositivo do usuário — um ambiente que a equipe de desenvolvimento não controla e que pode estar comprometido, seja por malware, seja por um dispositivo com root/jailbreak. Essa realidade exige uma abordagem de segurança diferente da aplicada em sistemas web tradicionais. Neste artigo, reunimos as práticas essenciais para proteger dados sensíveis em aplicativos móveis.
Nunca armazene segredos diretamente no código-fonte
Chaves de API, segredos de criptografia e credenciais hardcoded no código-fonte do aplicativo podem ser extraídos por qualquer pessoa com conhecimento básico de engenharia reversa, já que o APK ou IPA pode ser descompilado. Segredos sensíveis devem, sempre que possível, permanecer no backend, com o aplicativo se autenticando através de tokens de curta duração em vez de possuir credenciais permanentes embutidas.
Armazenamento seguro de dados locais
Dados sensíveis que precisam ser armazenados no dispositivo — tokens de sessão, informações de perfil — devem usar mecanismos de armazenamento criptografado oferecidos nativamente pela plataforma, como o EncryptedSharedPreferences no Android ou o Keychain no iOS, em vez de armazenamento em texto plano. Esses mecanismos utilizam hardware de segurança dedicado do dispositivo quando disponível, tornando a extração de dados significativamente mais difícil mesmo em caso de acesso físico ao aparelho.
val masterKey = MasterKey.Builder(context)
.setKeyScheme(MasterKey.KeyScheme.AES256_GCM)
.build()
val prefsCriptografadas = EncryptedSharedPreferences.create(
context, "dados_seguros", masterKey,
EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV,
EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM
)
Certificate pinning: proteção contra ataques man-in-the-middle
Mesmo com HTTPS, um dispositivo comprometido (ou em uma rede com um certificado malicioso instalado) pode ser vítima de interceptação de tráfego. Certificate pinning adiciona uma camada extra de verificação, validando não apenas que a conexão é HTTPS, mas que o certificado apresentado pelo servidor corresponde exatamente ao certificado esperado, previamente embutido no aplicativo — tornando significativamente mais difícil que um atacante intercepte e leia o tráfego de rede mesmo com um certificado tecnicamente válido instalado no dispositivo.
HTTPS protege contra interceptação em trânsito na rede pública, mas não protege contra um dispositivo já comprometido que confia em um certificado malicioso — é exatamente essa lacuna que o certificate pinning fecha.
Ofuscação de código para dificultar engenharia reversa
Ferramentas como R8/ProGuard no Android renomeiam classes, métodos e variáveis para nomes sem significado, além de remover código não utilizado, dificultando significativamente a leitura do código descompilado por terceiros. Embora ofuscação não seja uma proteção absoluta — um atacante determinado ainda pode fazer engenharia reversa com esforço suficiente — ela eleva consideravelmente a barreira de dificuldade e elimina ataques oportunistas mais simples.
Validação sempre no backend, nunca só no cliente
Qualquer validação de regra de negócio implementada apenas no lado do aplicativo pode ser contornada por um atacante que modifica o app ou envia requisições diretamente à API, ignorando completamente a interface. Validações client-side melhoram a experiência do usuário (feedback imediato), mas nunca substituem a validação e autorização real, que deve sempre acontecer no backend, tratando o cliente móvel como uma fonte não confiável.
Detecção de dispositivos comprometidos (root/jailbreak)
Para aplicativos que lidam com dados especialmente sensíveis — financeiros ou de saúde, por exemplo — vale considerar detectar se o dispositivo está com root ou jailbreak, condição que remove diversas proteções nativas do sistema operacional. Dependendo da criticidade do dado, a resposta pode variar de um simples aviso ao usuário até a restrição de determinadas funcionalidades sensíveis nesses dispositivos.
Considerações finais
Segurança em aplicativos móveis exige assumir, desde o início do desenvolvimento, que o dispositivo do usuário é um ambiente não totalmente confiável. Armazenamento criptografado, certificate pinning, ofuscação de código e validação sempre reforçada no backend formam a base de uma estratégia de segurança sólida para proteger dados sensíveis dos usuários. Se sua empresa precisa de uma revisão de segurança em um aplicativo móvel existente ou em desenvolvimento, a equipe da ASL Software Engineering pode ajudar. Fale com a gente.