Segurança moderna para desenvolvedores Android (parte 1)
Antes de mais nada, vamos falar um pouco sobre porque a segurança do smartphone é tão importante, nos anos 90 a televisão é o que o celular é hoje, todo mundo tinha um, mesmo sendo de classe média baixa, a população tinha uma televisão, agora imagine todas as pessoas que têm um celular Android, esse número sobe para 2,5 bilhões de telefones ativos, é nosso trabalho como desenvolvedores estarmos cientes dos perigos de fora, precisamos ser extremamente cuidadosos em favor de dois grandes forças maiores, a primeira, a empresa para a qual trabalhamos, e a segunda, que é muito mais importante, os usuários que nos fornecem seus dados.
Dentro do Google, a equipe do Android trabalhou muito para ter um sistema operacional verdadeiramente seguro.
Em 2018 o Android obteve 0 vulnerabilidades críticas de segurança e distribuiu patches de segurança para 84% dos aparelhos, mas ainda temos problemas, pois nem todos os telefones conseguem ter atualizações, já que em muitos países essas atualizações dependem das operadoras E embora os desenvolvedores não possam fazer muito sobre este grande problema, podemos tentar proteger nossos usuários de outros males, levando em consideração que eles não são adeptos da tecnologia e promovendo uma cultura em que tratamos nossos usuários como uma pessoa do outro lado da tela
A primeira vez que se fala em criptografia costuma causar uma sensação de complexidade e opressão, presume-se que seja um assunto completamente difícil de tratar, quando na realidade é completamente o oposto, revisando o seguinte esquema:
O esquema mais simples de um processo de criptografia
Nesse esquema, podemos ver que no início de tudo, temos dados que queremos criptografar, podendo ser a chave de um servidor, dados bancários ou dados pessoais de um usuário. Esses dados passam por um algoritmo, e esse algoritmo cria uma chave de criptografia, quando usarmos essa chave teremos nossos dados criptografados.
O que são Cipher, Mac, Signature e MessageDigest?
São algoritmos de criptografia, neste post falaremos apenas de Cipher, porém a diferença entre um e outro é bastante simples e eles funcionam praticamente da mesma forma, no celular geralmente precisamos de uma combinação para satisfazer um esquema de criptografia, este esquema é desenhado por um Modo, um algoritmo e um preenchimento, com este esquema podemos criar uma cifra, por exemplo:
Um algoritmo para esquema pode ser:
Advanced Encryption Standard (AES) ou Rivest – Shamir – Adleman (RSA)
Os modos podem ser:
Simétrico ou não simétrico, geralmente deve estar no modo CBG ou GCM com chaves de 256 bits
O preenchimento:
Esta parte do esquema não é obrigatória, mas ajuda muito se os dados que você planeja criptografar forem maiores do que a chave que você deseja usar, basicamente o que isso faz é colocar informações extras nos dados que serão criptografados.
No Android existe uma classe Cipher, que ajuda a criar um esquema, como desenvolvedores devemos levar em consideração que os algoritmos, padding e modos estão sujeitos às versões do Android que seu aplicativo suporta, bem como ao hardware que os dispositivos possuem, para para saber mais sobre os algoritmos e o suporte clique aqui; Como recomendação de segurança, os desenvolvedores não devem tentar criar um novo algoritmo, isso é completamente desnecessário e incrivelmente perigoso, portanto, evite criá-lo, na próxima parte desta série, falaremos sobre como você pode usá-lo sem criar um.
O que significa que a criptografia depende do sistema operacional e do hardware?
Praticamente significa que dependendo do seu sistema operacional e hardware, você será capaz de realizar certas operações diferentes de outros tipos de sistema operacional, e este tipo de operação afetará o desempenho da sua CPU e memória, então quando falamos sobre criptografia, não estamos falando apenas de software, também estamos falando hardware.
<application android:name=".YourApp" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:hardwareAccelerated="true"/>
Como desenvolvedores, há uma opção chamada acelerada por hardware que é usada para muitas coisas, ela pode ser colocada no android-manifest.xml para executar, por exemplo, animações complicadas ou visualização de computação, pode ser colocada dentro de todo o aplicativo ou dentro uma atividade específica, mesmo dentro de uma visualização, no entanto, é completamente necessária para realizar a criptografia, no passado, exatamente antes do Android 6.0, o processo de implementação de criptografia era baseado no destino dm-crypt device-mapper, que realizava o operações criptográficas por meio das interfaces provenientes do kernel Linux usando criptografia API. Atualmente isso mudou, os novos telefones têm slots de criptografia dedicados que podem acelerar por conta própria, uma vez que os provedores de telefone adicionaram um driver para usar a API de criptografia em seu kernel que tira proveito do hardware criptográfico do SoC, o que ajuda a bloquear a criptografia é alocada fora da CPU principal e garante tempos de acesso ao disco mais longos.
Criptografia de dados
Isso é muito diferente do Android 6.0, uma vez que o Android 7.0, a criptografia baseada em arquivos (FBE) é suportada, o que permite a criptografia de arquivos diferentes com chaves diferentes, que podem ser acessados e descriptografados de forma independente, sem se preocupar em filtrar as chaves dentro do aplicativo.
O Google está trabalhando em uma nova biblioteca que será entregue no conjunto Android Jetpack chamada: androidx.security:security-crypto:1.0.0-alpha02
ATUALIZAÇÃO para 23/05/2020: Esta biblioteca agora tem um Release Candidate
Os arquivos e dados que você deseja criptografar em um aplicativo serão protegidos por um sistema com um toque de permissão para impedir o acesso de outros aplicativos ou invasores em telefones com acesso root. Tendo um cuidado especial em uma mistura de bom desempenho e ótima segurança, implementado com suporte de hardware em conjunto com Keystore e a presença do usuário para fornecer a chave de acesso.
Falaremos um pouco mais sobre a biblioteca na próxima parte desta série, sem antes comentar que esta biblioteca representa uma grande limitação, devido à dependência da biblioteca Tink do Google para processos de criptografia, o min SDK suportado é 23. Sem No entanto, o Google está trabalhando para oferecer suporte a mais SDKs e prometeu que eles chegarão.
Esta é a lista de blogs que o periódico terá:
Parte 1 – Criptografia Vol 1 <<< ESTE.
Parte 2 – Criptografia Vol 2
Parte 3 – Criptografia Vol 3
Parte 4 – Biometria como autenticação local
Parte 5 – Módulos com código nativo
Parte 6 – SSL, TLS, camada de dados segura