Solução para encriptação criptográfica insegura

Estas informações destinam-se aos programadores com aplicações que contêm padrões de encriptação criptográfica inseguros, ou seja, é gerado um texto encriptado com uma chave secreta calculada estaticamente, um salt ou um vetor de inicialização (VI). A notificação da Play Console relativa à sua aplicação mostra as localizações da encriptação criptográfica insegura. 

Como corrigir alertas de "Padrões de encriptação de criptografia inseguros" 

Reveja a sua aplicação quanto a chaves calculadas estaticamente, vetores de inicialização e/ou salts que são utilizados em operações de encriptação criptográfica e assegure-se de que esses valores foram criados de forma segura. Por exemplo, o código seguinte utiliza uma chave secreta e um vetor de inicialização calculáveis estaticamente:

   // O alerta da consola refere-se a este método
  public byte[] encryptionUtil(String key, String iv, byte[] plainText) {
    Cipher cipher = Cipher.getInstance(“AES/GCM/NoPadding”);
    SecretKeySpec keySpec = new SecretKeySpec(key.getBytes(), “AES”);
    GCMParameterSpec paramSpec = new GCMParameterSpec(256, iv.getBytes());
    cipher.init(Cipher.ENCRYPT_MODE, keySpec, paramSpec);
    return cipher.doFinal(plainText);
  }

  // A chave e o vetor de inicialização inseguros estão aqui e devem ser alterados
  byte[] cipherText = encryptionUtil(“abcdef...”, “010203040506”, plainText);

Valores calculados estaticamente
Um valor calculado estaticamente é um valor que é sempre igual em todas as execuções da sua aplicação. Os valores criptográficos calculados estaticamente podem ser extraídos da sua aplicação e utilizados para atacar os dados encriptados da mesma. Mesmo que manipule chaves, vetores de inicialização e salts de formas complexas antes da utilização, estes continuam a ser inseguros caso as manipulações sejam iguais para todas as execuções do programa.

Práticas recomendadas para o Android
Recomendamos que utilize o Jetpack Security para criptografia simétrica. Se a sua aplicação encriptar chaves de API, informações de identificação pessoal (PII) ou outros dados confidenciais, EncryptedSharedPreferences pode ser utilizado para armazenar esses dados de forma segura sem que se tenha de preocupar com a implementação de chaves secretas, vetores de inicialização e salts. Pode obter mais práticas recomendadas e exemplos nesta página. Para transmitir dados em segurança para outros sistemas, os programadores devem utilizar TLS/SSL para proteger os dados na transmissão. 

O Jetpack Security utiliza o projeto de código aberto Tink da Google para processar a encriptação autenticada simétrica. Para exemplos de utilização avançados relativos a operações criptográficas de nível inferior, sugerimos utilizar o Tink diretamente.

Se as práticas recomendadas para o Android anteriores não satisfizerem o seu exemplo de utilização e tiver de gerir expressamente chaves, vetores de inicialização e salts, recomendamos seguir estes padrões:

  1. Chaves secretas: as chaves secretas simétricas têm de ser imprevisíveis e secretas. Para encriptar dados locais, os programadores devem criar as chaves secretas com aleatoriedade segura em termos criptográficos (ou a partir de dados gerados pelo utilizador, se estiver a ser utilizado o PBEKeySpecs) e armazenar as chaves secretas com o AndroidKeystore
  2. Vetores de inicialização: os vetores de inicialização têm de ser exclusivos e imprevisíveis em várias mensagens, mas não precisam de ser secretos. Os programadores devem criar os vetores de inicialização com aleatoriedade segura em termos criptográficos. Os programadores devem armazenar ou transmitir os vetores de inicialização juntamente com o texto encriptado associado.
  3. Salts: os salts têm de ser únicos e imprevisíveis em vários hashes, mas não precisam de ser secretos. Os programadores devem construir os salts com aleatoriedade segura em termos criptográficos. Os programadores devem armazenar ou transmitir os salts juntamente com os hashes associados.

Passos seguintes

  1. Atualize a sua aplicação ao seguir os passos realçados acima.
  2. Inicie sessão na Play Console e envie uma versão atualizada da aplicação.
Iremos rever novamente a sua aplicação. Se esta não tiver sido atualizada corretamente, continuará a ver o aviso. Este processo pode demorar várias horas.

Estamos aqui para ajudar

Se tiver perguntas técnicas acerca da vulnerabilidade, pode publicar uma mensagem no Stack Overflow e utilizar a etiqueta "android-security".
 
false
Menu principal
7790731839606029887
true
Pesquisar no Centro de ajuda
true
true
true
true
true
5016068
false
false