Skip to content

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:

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 Crypto foi removido e o provedor está preterido. O mesmo se aplica ao seu SHA1PRNG para 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:DESEDE e Signature:NONEWITHECDSA.
    • Você não deve mais usar IvParameterSpec.class para GCM, mas usar GCMParameterSpec.class em seu lugar.
    • Sockets mudaram de OpenSSLSocketImpl para ConscryptFileDescriptorSocket e ConscryptEngineSocket.
    • SSLSession com parâmetros nulos gera um NullPointerException.
    • 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.
  • 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 getInstance e 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 Crypto agora foi removido. Chamá-lo resultará em uma NoSuchProviderException.
  • 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 platform:android
MASTG-KNOW-0011 Security Provider platform:android
MASTG-KNOW-0013 Geração de números aleatórios platform:android