A criptografia (encryption) é o processo de converter dados em uma forma ilegível sem uma chave especial. Em aplicações móveis, a criptografia protege os dados pessoais dos usuários, informações de pagamento e a lógica de negócios contra interceptação e vazamento. De acordo com a Statista (2024), o número de violações de dados de aplicações móveis aumentou 38% em dois anos, e em 72% dos casos a causa foi a ausência ou uso incorreto da criptografia. As plataformas móveis modernas fornecem APIs integradas para criptografia, e seu uso é um padrão de segurança obrigatório. Statista, 2024
Principais pontos
Criptografia no contexto de aplicações móveis é a aplicação de algoritmos criptográficos para proteger dados armazenados no dispositivo (data at rest) e transmitidos pela rede (data in transit). No nível do dispositivo, o armazenamento local é criptografado: arquivos, bancos de dados, SharedPreferences e cache. No nível da rede, o tráfego entre o aplicativo e o servidor é criptografado por meio dos protocolos TLS/HTTPS. O objetivo final é garantir que, mesmo com acesso físico ao dispositivo ou interceptação de tráfego, um invasor não consiga ler os dados protegidos sem a chave criptográfica.
Os dispositivos móveis são particularmente vulneráveis à perda de dados: um telefone pode ser facilmente perdido, roubado ou infectado por malware. De acordo com o Ponemon Institute (2023), 42% das empresas afetadas por violações de dados atribuem os incidentes a dispositivos móveis. Sem criptografia, um invasor pode conectar-se ao dispositivo via USB, extrair o banco de dados SQLite e ler todos os dados armazenados. A criptografia resolve esse problema: mesmo que o banco de dados seja extraído, seu conteúdo permanece criptografado. Além disso, nos EUA e na UE existem leis (GDPR, CCPA) que exigem criptografia de dados pessoais e impõem multas de até 4% do faturamento anual por violações. O uso de criptografia não é apenas uma necessidade técnica, mas também legal para qualquer aplicação móvel que lide com dados de usuários.
Todos os algoritmos de criptografia se dividem em dois tipos principais: simétricos (uma chave para criptografar e descriptografar) e assimétricos (um par de chaves — pública e privada). A escolha do tipo depende do caso de uso: para criptografar dados locais, geralmente são usados algoritmos simétricos devido à sua velocidade, e para troca de chaves e autenticação, são usados os assimétricos.
| Característica | Simétrico | Assimétrico |
|---|---|---|
| Número de chaves | 1 (secreta) | 2 (pública + privada) |
| Velocidade | Alta (1–10 GB/s) | Baixa (1–10 MB/s) |
| Distribuição de chaves | Problemática — é preciso transmitir a chave | Simples — a chave pública é publicada |
| Exemplos | AES, ChaCha20 | RSA, ECDH, ECIES |
| Uso em desenvolvimento móvel | Criptografia de dados locais | Troca de chaves, assinaturas digitais |
Na prática, as aplicações móveis usam criptografia híbrida: com um algoritmo assimétrico (por exemplo, ECDH) as partes trocam uma chave de sessão, e todos os dados subsequentes são criptografados com um algoritmo simétrico (AES ou ChaCha20). Essa abordagem combina a velocidade da criptografia simétrica com a segurança da troca assimétrica de chaves. Este método é a base do TLS 1.3, Signal Protocol e Apple iMessage.
O desenvolvimento móvel moderno usa vários algoritmos de criptografia padronizados, cada um projetado para tarefas específicas com sua própria área de aplicação.
A criptografia protege os dados em três cenários principais: perda do dispositivo (criptografia de disco e contêineres do aplicativo), interceptação de tráfego (protocolos de rede TLS/HTTPS) e vazamento do servidor (criptografia de ponta a ponta). Cada cenário requer sua própria abordagem e ferramentas.
Os dados em repouso — dados no dispositivo — são criptografados via Android Keystore e iOS Keychain. No Android a partir da versão 7.0, é usada a criptografia baseada em arquivos (File-Based Encryption), e os aplicativos podem criptografar adicionalmente seus dados por meio de EncryptedSharedPreferences e EncryptedFile da biblioteca AndroidX Security. No iOS, todos os aplicativos funcionam por padrão com a Data Protection API, que criptografa arquivos no nível do sistema de arquivos com uma chave vinculada ao código do dispositivo. Para dados em trânsito, é usado TLS 1.2/1.3 com Certificate Pinning obrigatório.
A criptografia de ponta a ponta (E2E) é o nível mais alto de proteção de dados, onde uma mensagem é criptografada no dispositivo do remetente e descriptografada apenas no dispositivo do destinatário. O servidor de armazenamento e transmissão não tem acesso ao conteúdo — ele apenas manipula blobs criptografados. A implementação E2E mais conhecida para aplicações móveis é o Signal Protocol, que usa o algoritmo Double Ratchet em combinação com X3DH (Extended Triple Diffie-Hellman) para a troca inicial de chaves. O Signal Protocol fornece Perfect Forward Secrecy e future secrecy: a comprometimento de uma chave não revela mensagens anteriores ou posteriores. De acordo com um estudo da Universidade Carnegie Mellon (2023), a criptografia E2E em aplicativos de mensagens reduz o risco de vazamento de comunicação em 99,7% em comparação com a criptografia apenas TLS. O uso de E2E é obrigatório para aplicativos das categorias Health & Fitness e Finance de acordo com os requisitos do GDPR e HIPAA. Para implementar E2E em seu próprio projeto, recomenda-se usar a biblioteca Signal Protocol (Java/Swift) ou baseada em Olm (Matrix protocol). Ao escolher uma solução E2E, avalie a compatibilidade com a plataforma: o Signal Protocol requer suporte para envio assíncrono e armazenamento de chaves no cliente, o que complica cenários com vários dispositivos — para tais casos, o Matrix Protocol com seu modelo de salas pode ser uma escolha melhor.
Vamos ver um exemplo de criptografia e descriptografia de dados no Android usando Jetpack Security (AndroidX Security). A biblioteca fornece EncryptedFile para criptografia de arquivos e EncryptedSharedPreferences para configurações.
val masterKey = MasterKey.Builder(context)
.setKeyScheme(MasterKey.KeyScheme.AES256_GCM)
.build()
val encryptedFile = EncryptedFile.Builder(
context,
File(context.filesDir, "secret.dat"),
masterKey,
EncryptedFile.FileEncryptionScheme.AES256_GCM_HKDF_4KB
).build()
encryptedFile.openFileOutput(applicationContext).use { outputStream ->
outputStream.write("Sensitive user data".toByteArray(Charsets.UTF_8))
}
O MasterKey é criado usando AES256-GCM — o modo de criptografia simétrica mais seguro. A chave é armazenada no Android Keystore, isolado do processo principal: mesmo que o aplicativo seja comprometido, um invasor não pode extrair a chave. O EncryptedFile usa o esquema AES-256-GCM com HKDF para derivação de chave e tamanho de página de 4KB, proporcionando um bom equilíbrio entre velocidade e segurança. Para ler dados, é usado openFileInput com os mesmos parâmetros: a biblioteca descriptografa automaticamente os dados ao ler.
No iOS, funcionalidade semelhante é fornecida através do CryptoKit (Swift) usando AES.GCM ou ChaChaPoly. A chave é armazenada no Secure Enclave através do Keychain Services. O princípio é o mesmo: as chaves nunca saem do armazenamento de hardware seguro, e os dados são criptografados antes de serem gravados no disco. Essa arquitetura está em conformidade com as recomendações OWASP MASVS (Mobile Application Security Verification Standard) nível L2 para aplicativos que lidam com dados sensíveis. Em projetos reais, a combinação de EncryptedSharedPreferences para tokens e EncryptedFile para dados do usuário cobre 100% dos cenários de criptografia local. Além disso, para trabalhar com chaves recebidas do servidor (por exemplo, chaves de sessão ECDH), o Android KeyStore é usado com o parâmetro purpose = KeyProperties.PURPOSE_ENCRYPT, que garante que a chave só possa ser usada para operações criptográficas autorizadas e nunca seja exportada do armazenamento de hardware para a RAM em texto simples.
Perguntas frequentes
AES-256 no modo GCM com armazenamento de chave em armazenamento de hardware (Android Keystore / iOS Keychain) é considerado o padrão ouro. Para tráfego de rede — TLS 1.3 com a curva elíptica Curve25519. ChaCha20-Poly1305 é usado como alternativa em dispositivos sem AES de hardware.
AES é um algoritmo simétrico (uma chave), rápido, adequado para criptografar grandes volumes de dados. RSA é assimétrico (um par de chaves), lento, usado para criptografia de chaves e assinaturas, não para dados. Em aplicações móveis, o AES criptografa dados, o RSA protege chaves.
É necessário criptografar os dados confidenciais: tokens de acesso, senhas, informações pessoais, dados de pagamento, registros médicos. Dados públicos (imagens, conteúdo) podem ficar sem criptografia, embora seja melhor armazená-los em um contêiner protegido do aplicativo.
Com a criptografia de ponta a ponta, os dados são criptografados no dispositivo do remetente antes do envio e descriptografados apenas no dispositivo do destinatário. O servidor vê apenas dados criptografados. O protocolo Double Ratchet, implementado no Signal Protocol, é o mecanismo E2E mais comum em mensageiros móveis.
Tecnicamente possível, mas não recomendado. Para dados no dispositivo, use criptografia simétrica (AES-GCM) com uma chave do Keystore. Para a rede, use TLS 1.3 com um conjunto separado de chaves e Certificate Pinning. A separação impede que ambos os canais sejam comprometidos se uma chave vazar.
Resumo
Vamos desenvolver um aplicativo móvel chave na mão
A IT Sectr cria aplicativos para iOS e Android para startups e empresas desde 2017. Nós vamos aconselhá-lo e propor a melhor solução.
Leia também