Solución para el cifrado criptográfico no seguro

Esta información va dirigida a los desarrolladores que tengan aplicaciones con patrones de cifrado criptográfico no seguros, es decir, un texto cifrado que se genera con una clave secreta, una salt o un vector de inicialización (IV) calculados de forma estática. Puedes encontrar las ubicaciones del cifrado criptográfico no seguro en la notificación de Play Console de tu aplicación. 

Cómo corregir las alertas de patrones de cifrado criptográfico no seguros 

Revisa tu aplicación y busca claves, vectores de inicialización o salts que se hayan calculado de forma estática y se utilicen en operaciones de cifrado criptográfico. Asegúrate de que sus valores se hayan creado de forma segura. Por ejemplo, el siguiente código utiliza una clave secreta y un vector de inicialización calculados de forma estática:

   // La alerta de Play Console se refiere 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);
  }

  // La clave y el vector de inicialización no seguros se encuentran en este fragmento y deben cambiarse
  byte[] cipherText = encryptionUtil(“abcdef...”, “010203040506”, plainText);

Valores calculados de forma estática
Un valor calculado de forma estática sigue siendo el mismo cada vez que se ejecuta tu aplicación. Los valores criptográficos calculados de forma estática se pueden extraer de la aplicación y se pueden utilizar para atacar sus datos cifrados. Aunque manipules las claves, los vectores de inicialización y las salts de forma compleja antes de utilizarlos, seguirán sin ser seguros si las manipulaciones son las mismas cada vez que se ejecuta el programa.

Prácticas recomendadas para Android
Te recomendamos que utilices Jetpack Security para obtener una criptografía simétrica. Si tu aplicación cifra claves de API, información personal identificable y otros datos sensibles, puedes utilizar EncryptedSharedPreferences para almacenar estos datos de forma segura sin tener que preocuparte de implementar claves secretas, vectores de inicialización y salts. Puedes encontrar más prácticas recomendadas y ejemplos en esta página. Para transmitir datos de forma segura a otros sistemas, los desarrolladores utilizan TLS/SSL

Jetpack Security utiliza el proyecto de software libre Tink de Google para llevar a cabo el cifrado autenticado simétrico. Para casos avanzados relacionados con operaciones criptográficas de menor nivel, recomendamos utilizar Tink directamente.

Si las prácticas recomendadas que hemos descrito no se adaptan a tu caso y tienes que utilizar claves, vectores de inicialización y salts obligatoriamente, te recomendamos que sigas estos estándares:

  1. Claves secretas: las claves simétricas deben ser impredecibles y secretas. Para cifrar datos locales, los desarrolladores deben crear claves secretas de forma aleatoria y con un cifrado seguro y almacenarlas utilizando AndroidKeystore. Si se utiliza PBEKeySpecs, pueden crearse a partir de los datos generados por los usuarios. 
  2. Vectores de inicialización: los vectores de inicialización deben ser únicos e impredecibles en diferentes mensajes, pero no es necesario que sean secretos. Los desarrolladores deben crear los vectores de inicialización de forma aleatoria y con un cifrado seguro y deben almacenarlos o transmitirlos junto con el texto cifrado asociado.
  3. Salts: las salts deben ser únicas e impredecibles en diferentes hashes, pero no es necesario que sean secretas. Los desarrolladores deben crear las salts de forma aleatoria y con un cifrado seguro y deben almacenarlas o transmitirlas junto con el texto cifrado asociado.

Pasos siguientes

  1. Actualiza tu aplicación siguiendo los pasos mencionados anteriormente.
  2. Inicia sesión en Play Console y envía la versión actualizada de tu aplicación.
Revisaremos tu aplicación de nuevo. Si no se ha actualizado correctamente, seguirás viendo la advertencia. Este proceso puede tardar varias horas en completarse.

Queremos ayudarte

Si tienes alguna pregunta técnica sobre esta vulnerabilidad, puedes publicarla en Stack Overflow con la etiqueta "android-security".
 

¿Te ha resultado útil esta información?

¿Cómo podemos mejorar esta página?
false
Menú principal
13128747396652821636
true
Buscar en el Centro de ayuda
true
true
true
true
true
5016068
false
false