APIs Criptográficas do Android¶
Visão Geral¶
No capítulo "Criptografia em Aplicativos Móveis", introduzimos as melhores práticas gerais de criptografia e descrevemos problemas típicos que podem ocorrer quando a criptografia é usada incorretamente. Neste capítulo, entraremos em mais detalhes sobre as APIs de criptografia do Android. Mostraremos como identificar o uso dessas APIs no código-fonte e como interpretar configurações criptográficas. Ao revisar o código, certifique-se de comparar os parâmetros criptográficos utilizados com as melhores práticas atuais, conforme vinculado neste guia.
Podemos identificar os componentes-chave do sistema de criptografia no Android:
As APIs de criptografia do Android são baseadas na Java Cryptography Architecture (JCA). A JCA separa as interfaces da implementação, tornando possível incluir vários provedores de segurança que podem implementar conjuntos de algoritmos criptográficos. A maioria das interfaces e classes da JCA são definidas nos pacotes java.security.* e javax.crypto.*. Além disso, existem pacotes específicos do Android: android.security.* e android.security.keystore.*.
KeyStore e KeyChain fornecem APIs para armazenar e usar chaves (nos bastidores, a API KeyChain usa o sistema KeyStore). Esses sistemas permitem administrar o ciclo de vida completo das chaves criptográficas. Requisitos e orientações para implementação do gerenciamento de chaves criptográficas podem ser encontrados no Key Management Cheat Sheet. Podemos identificar as seguintes fases:
- geração de uma chave
- uso de uma chave
- armazenamento de uma chave
- arquivamento de uma chave
- exclusão de uma chave
Observe que o armazenamento de uma chave é analisado no capítulo "Teste de Armazenamento de Dados".
Essas fases são gerenciadas pelo sistema Keystore/KeyChain. No entanto, como o sistema funciona depende de como o desenvolvedor do aplicativo o implementou. Para o processo de análise, você deve se concentrar nas funções que são usadas pelo desenvolvedor do aplicativo. Você deve identificar e verificar as seguintes funções:
- Geração de Chaves
- Geração de números aleatórios
- Rotação de chaves
Aplicativos que têm como alvo níveis de API modernos passaram pelas seguintes mudanças:
- Para Android 7.0 (nível de API 24) e superior, o blog do Android Developer mostra que:
- É recomendado parar de especificar um provedor de segurança. Em vez disso, sempre use um Security Provider corrigido.
- O suporte para o provedor
Cryptofoi removido e o provedor está preterido. O mesmo se aplica ao seuSHA1PRNGpara aleatório seguro.
- Para Android 8.1 (nível de API 27) e superior, a Documentação do Desenvolvedor mostra que:
- Conscrypt, conhecido como
AndroidOpenSSL, é preferido em vez de usar Bouncy Castle e tem novas implementações:AlgorithmParameters:GCM,KeyGenerator:AES,KeyGenerator:DESEDE,KeyGenerator:HMACMD5,KeyGenerator:HMACSHA1,KeyGenerator:HMACSHA224,KeyGenerator:HMACSHA256,KeyGenerator:HMACSHA384,KeyGenerator:HMACSHA512,SecretKeyFactory:DESEDEeSignature:NONEWITHECDSA. - Você não deve mais usar
IvParameterSpec.classpara GCM, mas usarGCMParameterSpec.classem seu lugar. - Sockets mudaram de
OpenSSLSocketImplparaConscryptFileDescriptorSocketeConscryptEngineSocket. SSLSessioncom parâmetros nulos gera umNullPointerException.- Você precisa ter arrays suficientemente grandes como input bytes para gerar uma chave; caso contrário, uma
InvalidKeySpecExceptioné lançada. - Se uma leitura de socket for interrompida, você recebe uma
SocketException.
- Conscrypt, conhecido como
- Para Android 9 (nível de API 28) e superior, o Android Developer Blog mostra ainda mais mudanças:
- Você recebe um aviso se ainda especificar um provedor de segurança usando o método
getInstancee tiver como alvo qualquer API abaixo de 28. Se você tem como alvo Android 9 (nível de API 28) ou superior, você recebe um erro. - O provedor de segurança
Cryptoagora foi removido. Chamá-lo resultará em umaNoSuchProviderException.
- Você recebe um aviso se ainda especificar um provedor de segurança usando o método
- Para Android 10 (nível de API 29), a Documentação do Desenvolvedor lista todas as mudanças de segurança de rede.
Recomendações Gerais:
A lista a seguir de recomendações deve ser considerada durante a análise do aplicativo:
- Você deve garantir que as melhores práticas delineadas no capítulo "Criptografia para Aplicativos Móveis" sejam seguidas.
- Você deve garantir que o provedor de segurança tenha as atualizações mais recentes - Atualizando o provedor de segurança.
- Você deve parar de especificar um provedor de segurança e usar a implementação padrão (AndroidOpenSSL, Conscrypt).
- Você deve parar de usar o provedor de segurança Crypto e seu
SHA1PRNG, pois estão preteridos. - Você deve especificar um provedor de segurança apenas para o sistema Android Keystore.
- Você deve parar de usar cifras de criptografia baseadas em senha sem IV.
- Você deve usar KeyGenParameterSpec em vez de KeyPairGeneratorSpec.
Knowledge Articles¶
| ID | Name | Platform |
|---|---|---|
| MASTG-KNOW-0012 | Geração de Chaves | |
| MASTG-KNOW-0011 | Security Provider | |
| MASTG-KNOW-0013 | Geração de números aleatórios |