Encriptando dados pessoais de usuários no Android

Bernardoslailati
#LocalizaLabs
Published in
5 min readJul 22, 2022

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.

Disposição de pastas e arquivos do projeto no Android Studio. https://github.com/BernardoSlailati/EncryptSensibleData

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.

Exemplo de uso do aplicativo: encriptação e decriptação de um perfil de usuário salvo.

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.

Arquivos gerados pelas diferentes instâncias de preferências.

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…

--

--