Encriptando dados pessoais de usuários no Android
O que são dados pessoais?
Ao manter localmente informações gerais de usuários armazenadas em aplicações mobile, é necessário ter muito cuidado na forma em que esses dados são salvos! Principalmente os chamados dados pessoais…
São considerados dados pessoais aqueles que comumente fornecemos em um cadastro de pessoa física, como:
- Nome;
- RG e CPF;
- Gênero;
- Data e local de nascimento;
- Filiação;
- Telefone;
- Endereço residencial;
- Cartão e dados bancários.
A atenção deve ser redobrada ao manipular valores desse tipo em um projeto, pois devemos sempre nos preocupar em manter intacto os direitos de privacidade de nossos usuários.
O que a LGPD recomenda?
Formalmente, a LGPD (Lei Geral de Proteção de Dados Pessoais) não cita diretamente em seus artigos a palavra “encriptação” como uma técnica a ser utilizada para alcançar o cenário ideal de ofuscação dos dados pessoais, porém indica o uso da prática da anonimização. Esta é definida no Artigo 5º da seguinte forma:
“Utilização de meios técnicos razoáveis e disponíveis no momento do tratamento, por meio dos quais um dado perde a possibilidade de associação, direta ou indireta, a um indivíduo.”
Esse artigo tem como principal foco mostrar como é possível manter armazenados tais tipos de dados de forma anonimizada em um projeto Android nativo, utilizando linguagem Kotlin e bibliotecas recomendadas pela própria Google em projetos escaláveis, contidas no pacote Jetpack.
Bora lá conferir?
Estrutura do Projeto
Logo abaixo, é detalhada a estrutura de um projeto exemplo básico - disponível aqui - que aplica técnicas de encriptação e decriptação dos dados que caracterizam o perfil de um usuário inserido manualmente, a ser salvo no contexto padrão de preferências do Android. Além disso, esse projeto segue padrões de arquitetura limpa e MVVM, junto a aplicação de injeção de dependências via biblioteca Koin.
Dependências
Necessário adicionar ao projeto a seguinte dependência no arquivo build-gradle de nível do app:
dependencies {
def crypto_version = "1.1.0-alpha03" // versão mais recente no
// momento implementation "androidx.security:securitycrypto:$crypto_version"
}
Tal biblioteca tem como função viabilizar o gerenciamento de chaves seguras de criptografia para encriptar e decriptar arquivos e preferências compartilhadas de usuários.
Obs: a versão 1.0.0 da biblioteca Security é compatível com dispositivos que executam o Android 6.0 (API de nível 23) e versões mais recentes. Uma versão mais recente da biblioteca é compatível com outras versões anteriores do Android.
Fonte de Dados
Classe de acesso e escrita aos dados anonimizados do perfil do usuário, executando as lógicas de salvar e buscar localmente o perfil através das preferências, em um arquivo XML, de forma segura por meio de encriptação.
O algoritmo de encriptação aplicado, entregue como padrão pela biblioteca EncryptSharedPreferences ao construir a instância de acesso a base de dados dessas preferências, é o AES-256, considerado um mais seguros da atualidade.
A chave de encriptação utilizada foi criada de forma aleatória, através da chamada da linha 16. Embora seja recomendável usar essa implementação, você também poderá gerar sua própria chave de forma livre através do KeyGenParameterSpec caso precise de mais controle sobre esse processo.
O conteúdo armazenado utilizando essa instância de preferências será disposta em um arquivo XML com o nome “_androidx_security_master_key_”, advindo do valor MasterKey.DEFAULT_MASTER_KEY_ALIAS e podendo ser alterado de forma livre através do parâmetro da linha 15.
Repositório
Realiza as chamadas das funções da fonte de dados do perfil, se adequando a uma arquitetura mais clara de acesso, para ser utilizado posteriormente nos casos de uso desse mesmo contexto.
Casos de Uso
Executa as tarefas de salvar e buscar o perfil de forma totalmente assíncrona em âmbitos separados, a serem utilizados no ViewModel relacionado ao contexto de perfil do usuário.
ViewModel
Disponibiliza para as views da aplicação o acesso às execuções assíncronas dos casos de uso de buscar e salvar o perfil de um usuário nas preferências encriptadas, além de entregar variáveis de estado observáveis que poderão refletir em mudanças visuais na interface da aplicação.
Resultado
A seguir, será apresentado um exemplo de utilização desse aplicativo de forma rápida, simulando a ação de salvar um perfil de usuário encriptado específico com as informações de nome, CPF, telefone e senha e uma posterior verificação do resultado da decriptação desse mesmo perfil.
Acessando a pasta raíz desse aplicativo no dispositivo do qual foi instalado, por ser uma versão debug, é possível ver e comparar o conteúdo salvo do exemplo acima, utilizando as diferentes instâncias de preferências: EncryptSharedPreferences e SharedPreferences, respectivamente.
Com isso, nota-se que os dados do usuário - que poderiam estar totalmente expostos utilizando a instância convencional de preferências! - foram devidamente anonimizados. Isso irá evitar que uma possível engenharia reversa do APK revele de forma direta os dados de perfis salvos internamente na sua aplicação!
Obrigado por ter chegado até aqui e espero muito que esse artigo possa contribuir com o aumento da segurança de suas aplicações!
E lembre-se sempre…