Skip to content

12- Local Encryption issues & Hardcoded secrets

Una de las cosas que aún no hemos hablado es de la encriptación, se está haciendo local.

En la clase DoLogin :

java
private void saveCreds(String username, String password) throws BadPaddingException, NoSuchPaddingException, IllegalBlockSizeException, NoSuchAlgorithmException, InvalidKeyException, UnsupportedEncodingException, InvalidAlgorithmParameterException {
	SharedPreferences mySharedPreferences = DoLogin.this.getSharedPreferences("mySharedPreferences", 0);
	SharedPreferences.Editor editor = mySharedPreferences.edit();
	DoLogin.this.rememberme_username = username;
	DoLogin.this.rememberme_password = password;
	String base64Username = new String(Base64.encodeToString(DoLogin.this.rememberme_username.getBytes(), 4));
	CryptoClass crypt = new CryptoClass();
	DoLogin.this.superSecurePassword = crypt.aesEncryptedString(DoLogin.this.rememberme_password);
	editor.putString("EncryptedUsername", base64Username);
	editor.putString("superSecurePassword", DoLogin.this.superSecurePassword);
	editor.commit();
}

El username se guarda en mySharedPreferences en base64 solo.

La contraseña si que se cifra con AES:

java
DoLogin.this.superSecurePassword = crypt.aesEncryptedString(DoLogin.this.rememberme_password);

Que pasa, la contraseña maestra está en el .dex, ¿Qué es el dex? :

  1. Escribes código Java/Kotlin (.java/.kt).
  2. El compilador (javac) lo convierte a bytecode JVM normal (.class).
  3. La herramienta d8/dx de Android toma esos .class y los convierte a .dex — un formato distinto, optimizado para dispositivos móviles (más compacto, una sola tabla de constantes compartida entre todas las clases, en vez de un archivo .class por clase).
  4. Todos los .dex van en el APK

La contraseña está en CryptoClass.java hardcodeada

java
String key = "This is the super secret key 123";

Además el factor de inicialización IV es estático

java
byte[] ivBytes = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};

Esta misma lógica se usa en el MyBroadcastReceiver y en DoTransfer

¿Qué se debería hacer?

  • Reemplazar esta clave estática por una generada y gestionada por Android Keystore, nunca hardcodeada en código.

Notas personales de seguridad ofensiva.