Solución para la encriptación no segura

Esta información está dirigida a los desarrolladores cuyas apps contienen patrones de encriptación no segura, es decir, cifrado generado con claves secretas, sales o vectores de inicialización (IV) computados de forma estática. Las ubicaciones de la encriptación no segura pueden consultarse en la notificación de Play Console de tu app. 

Cómo solucionar alertas de "Patrones de encriptación no segura" 

Revisa si tu app contiene claves, vectores de inicialización o sales computadas de forma estática que se usen en operaciones de encriptación y asegúrate de que esos valores se generen de manera segura. Por ejemplo, el siguiente código usa una clave secreta y un vector de inicialización computables de forma estática:

   // La alerta de 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 están en la siguiente línea y deberían modificarse:
  byte[] cipherText = encryptionUtil(“abcdef...”, “010203040506”, plainText);

Valores computados de forma estática
Un valor computado de forma estática es aquel que se mantiene igual en todas las ejecuciones de tu app. Los valores criptográficos computados de forma estática pueden extraerse de tu app y usarse para atacar los datos encriptados que esta contenga. Incluso aunque manipules las claves, los vectores de inicialización y las sales de formas complejas antes de usarlos, siguen siendo no seguros si esas manipulaciones son las mismas en cada ejecución del programa.

Prácticas recomendadas para Android
Se recomienda usar Jetpack Security para emplear criptografía simétrica. Si tu app encripta claves de API, información de identificación personal (PII) o algún otro tipo de datos sensibles, puedes usar EncryptedSharedPreferences para almacenar estos datos de forma segura sin preocuparte por la implementación de claves secretas, vectores de inicialización ni sales. Puedes ver ejemplos y otras prácticas recomendadas en esta página. Para transmitir datos a otros sistemas de manera segura, los desarrolladores deberían usar TLS/SSL a fin de proteger los datos durante la transmisión. 

Jetpack Security utiliza el proyecto de código abierto de Google Tink para administrar la encriptación autenticada simétrica. En los casos prácticos avanzados que se relacionan con operaciones criptográficas de nivel inferior, se recomienda usar Tink directamente.

Si las recomendaciones para Android antes mencionadas no se ajustan a tu caso práctico y debes administrar claves, vectores de inicialización y sales de forma explícita, te sugerimos seguir estos estándares:

  1. Claves secretas: Las claves secretas simétricas deben ser impredecibles y confidenciales. Para encriptar datos locales, los desarrolladores deberían generar claves secretas mediante aleatoriedad segura a nivel criptográfico (o a partir de datos generados por el usuario si se usa PBEKeySpecs) y almacenarlas empleando AndroidKeystore
  2. Vectores de inicialización: Los vectores de inicialización deben ser impredecibles y únicos entre diversos mensajes, pero no es necesario que sean secretos. Los desarrolladores deberían generar los vectores de inicialización mediante aleatoriedad segura a nivel criptográfico. Además, deberían almacenarlos o transmitirlos junto con el cifrado asociado.
  3. Sales: Las sales deben ser impredecibles y únicas entre diversos hashes, pero no es necesario que sean secretas. Los desarrolladores deberían generar las sales mediante aleatoriedad segura a nivel criptográfico. Además, deberían almacenarlas o transmitirlas junto con los hashes asociados.

Próximos pasos

  1. Actualiza la app por medio de los pasos destacados anteriormente.
  2. Accede a Play Console y envía una versión actualizada de tu app.
Se volverá a revisar tu app. Si no se actualizó correctamente, seguirás viendo la advertencia. Este proceso puede tardar varias horas.

Estamos aquí para ayudarte

Si tienes preguntas técnicas sobre la vulnerabilidad, publícalas en Stack Overflow con la etiqueta "android-security".
 
false
Menú principal
18224512512939520612
true
Buscar en el Centro de asistencia
true
true
true
true
true
5016068
false
false