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? :
- Escribes código Java/Kotlin (
.java/.kt). - El compilador (
javac) lo convierte a bytecode JVM normal (.class). - La herramienta
d8/dxde Android toma esos.classy 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.classpor clase). - Todos los
.dexvan 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.