Estas informações são destinadas a desenvolvedores de apps com padrões de criptografia não seguros. Ou seja, um texto criptografado é gerado com um sal, chave secreta ou vetor de inicialização (IV, na sigla em inglês) calculado estaticamente. Veja os locais com criptografia não segura na notificação do Play Console referente ao app.
Como corrigir alertas sobre padrões de criptografia não seguros
Confira se o app tem chaves, vetores de inicialização e/ou sais calculados estaticamente usados em operações de criptografia e garanta que esses valores sejam construídos com segurança. Por exemplo, o código a seguir usa uma chave secreta e um vetor de inicialização calculados estaticamente: // O alerta do console se refere 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);
}
// Estes são a chave e o vetor de inicialização não seguros, que precisam ser alterados
byte[] cipherText = encryptionUtil(“abcdef...”, “010203040506”, plainText);
Valores calculados estaticamente
Um valor calculado estaticamente é igual em todas as execuções do app. Os valores criptográficos desse tipo podem ser extraídos do app e usados para atacar os dados criptografados dele. Mesmo que você manipule chaves, vetores de inicialização e sais de formas complexas antes do uso, eles ainda não serão seguros se esse processo for o mesmo a cada execução do programa.
Práticas recomendadas do Android
Recomendamos que você use o Jetpack Security para criptografia simétrica. Se o app criptografar chaves de API, informações de identificação pessoal (PII) ou outros dados confidenciais, use EncryptedSharedPreferences para armazenar esses dados com segurança sem se preocupar com a implementação de chaves secretas, vetores de inicialização e sais. Veja também outras práticas recomendadas e exemplos. Para transmitir dados com segurança a outros sistemas, os desenvolvedores precisam usar TLS/SSL.
O Jetpack Security usa o projeto de código aberto Tink, do Google, para processar a criptografia simétrica autenticada. Para casos de uso avançados em operações criptográficas de nível inferior, sugerimos o uso direto do Tink.
Se as práticas recomendadas do Android vistas acima não se aplicarem ao seu caso, e você tiver que gerenciar chaves, vetores de inicialização e sais explicitamente, recomendamos seguir estes padrões:
- Chaves secretas: as chaves secretas simétricas precisam ser imprevisíveis e confidenciais. Para criptografar dados locais, os desenvolvedores precisam criar chaves secretas usando números aleatórios criptograficamente seguros (ou dados gerados pelo usuário, quando utilizam PBEKeySpecs) e armazená-las com o AndroidKeystore.
- Vetores de inicialização: esses vetores têm que ser exclusivos e imprevisíveis entre diferentes mensagens, mas não necessariamente secretos. Para criá-los, os desenvolvedores precisam usar números aleatórios criptograficamente seguros. Também é preciso armazenar ou transmitir os vetores de inicialização com o respectivo texto criptografado.
- Sais: os sais têm que ser exclusivos e imprevisíveis entre diferentes hashes, mas não necessariamente secretos. Para criá-los, os desenvolvedores precisam usar números aleatórios criptograficamente seguros. Também é preciso armazenar ou transmitir os sais com os respectivos hashes.
Próximas etapas
- Atualize o app de acordo com as etapas destacadas acima.
- Faça login no Play Console e envie uma versão atualizada do app.