Seguridad Moderna para Android Developers (parte 3)

Modern Security in Android a fast guide to be safe

Dinorah Tovar
Droid LATAM
3 min readJul 17, 2020

--

Este post está relacionado con mi última plática “Modern Security for Android Developers”.

Esta es la lista de blogs que tendrá el serial:

En el último post, hablamos sobre JetPack Security, y cómo podemos hacer un manejo de las Llaves.
Una vez que hayas creado tu Master Key el siguiente paso es utilizarlo, dentro de Jetpack Security, puedes encriptar Archivos (Files) y Shared Preferences

SharedPreferences

Shared Preferences son la forma más primitiva de guardar data dentro de Android, puedes guardar valores en formato: Key — Value.
Esta data es almacenada en files con formato XML dentro del directorio interno de la app, cuyo espacio no es accesible por el usuario de manera default. Como recomendación, los desarrolladores deberían de utilizar la bandera: MODE_PRIVATE para la creación de shared preferences, haciendo que el archivo creado solo pueda ser accesible por la aplicación en la que fue creada (o todas las aplicaciones compartiendo el mismo user ID)

Sin embargo, dado el hecho de que se puede extraer data desde la app en debug mode, usando el Device Monitor dentro de Android Studio, es bastante obvio que Jetpack security no esta usando SharedPreferences y Files; para la encriptación está usando: EncryptedSharedPreferences y EncryptedFile

La primera es un wrapper de la clase de SharedPreferences, y automáticamente encripta tanto las keys como los valus usando el esquema de dos métodos

  • Keys seran encriptadas usando un algoritmo de encriptación determinístico, la llave será bloqueada a su vez.
  • Values are encrypted using AES-256 GCM and are non-deterministic.

EncryptedSharedPreferences

EncryptedSharedPreferences requerirán el uso de Context para poder crear la instancia necesaria, y necesitamos mandar a traer el método create() en orden de crear la instancia necesaria.

  • masterKeyAlias: Es la llave que se usará para la encriptación de la cual hablamos en el artículo anterior
  • context: En orden para acceder a los Shared Preferences
  • prefKeyEncryptionScheme: El esquema que se usará para almacenar la key
  • prefValueEncryptionScheme:El esquema que se usará para almacenar el value

Para leer y escribir en EncryptedSharedPreferences, puedes hacerlo como siempre:

Files

EncryptedFile también utiliza un custom implementation de FileInputStream y FileOutStream, dando a las aplicaciones streams seguros para leer y escribir.

Para proveer operaciones de lectura y escritura desde file streams, Jetpack Security usa Streaming Authenticated Encryption con Associated Data (AEAD) que provee encriptación autenticada para la data, es bastante sencillo, cuando la data a encriptar es demasiado grande para ser procesada de un solo golpe, este es el mismo procedimiento que usa Tink de Google.

Los modos subyacentes de encriptación, son seleccionados para que pedazos parciales de plaintext puedan ser obtenidos de manera rápida sean desencriptados y autenticados cómo solo una parte del cipherText y no tengamos la necesidad de procesar completo el cipherText

El unico problema de los Files, es que la encriptación debe de realizarse una vez, por asi decirlo, no hay manera de modificar el texto existente en cipherText o appendar el texto a un archivo que ya existe, por lo que nos obliga a crear el archivo de nuevo.
Y tenemos también el limite teórico de longitudes en los archivos:

  • Plaintext: Puede ser un límite arbitrario entre 0..2³⁸ y associated data con un límite arbitrario en el rango de 0..2(³¹)–1 bytes

Hay una clase relacionada a EncryptedFile component, llamada EncryptedFile.Builder:

  • file: El file a encriptar, con su Path
  • context: En orden para acceder a los Shared Preferences
  • masterKeyAlias: Es la llave que se usará para la encriptación de la cual hablamos en el artículo anterior
  • fileEncryptionScheme: El esquema que se usará para escribir Bytes al File

Para leer y escribir en EncryptedFile, puedes hacerlo cómo siempre:

Update del 4 Junio 2020 :

Al parecer la libreria debe implementar esto en los archivos *.pro en release, si no la applicación crasheara en runtime
Bug en Tink library:
https://github.com/google/tink/issues/361

# Security
-keepclassmembers class * extends com.google.crypto.tink.shaded.protobuf.GeneratedMessageLite {
<fields>;
}

Esto es todo por este post, si requieres ayuda:

Siempre estoy feliz de ayudar y puedes encontrarme en:
Medium: https://medium.com/@dinorahto
Twitter: https://twitter.com/DDinorahtovar
StackOverflow: https://stackoverflow.com/users/4613259/dinorah-tovar

Happy Coding! 👩🏻‍💻

--

--

Dinorah Tovar
Droid LATAM

Google Developer Expert on Android | Doing Kotlin | Making Software 24/7 | Kotlin Multiplatform | She/Her | Opinions are my own, and not my employer