Seguridad Moderna para Android Developers (parte 2)

Modern Security in Android a fast guide to be safe

Dinorah Tovar
Droid LATAM
5 min readJun 2, 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:

Modern Security for Android Developers

En el post pasado de este serial hablamos sobre cómo Google está trabajando en una nueva librería que será entregada como parte de Android Jetpack: androidx.security:security-crypto El tiempo ha pasado y por fin security-crypto ahora se encuentra en release candidate!

Asi que ahora la puedes encontrar como : androidx.security:security-crypto:1.0.0-rc02

Muchos developers se han preguntado por qué necesitamos una nueva librería de encriptación si contamos con android.security.keystore, que nos da la oportunidad de crear llaves de dos tipos, llaves asimétricas o llaves simétricas, esta nueva librería usa el patrón de creación provisto por Keystore, pero en un estilo diferente para proveer configuraciones seguras en la creación de llaves, tomando en consideración una encriptación segura y un buen perfomance.

En iOS, hay algo llamado KeyChain, que almacena las llaves y valores de los usuarios de manera segura, en Android tenemos KeyStore, y una de las cosas que necesitas saber es que necesitamos un Provider para usarlo. El sistema de Keystore permite almacenar llaves criptográficas en un contenedor para hacer más difícil la extracción del dispositivo. Una vez que las llaves se encuentran en Keystore pueden usarse para operaciones criptográficas, dejando las llaves del material de manera no exportable.

Además, ofrece facilidades para restringir el cómo y cuando son usadas estas llaves, como por ejemplo, requerir autenticación local para usarlas y restringir las llaves a un modo específico de encriptación.

¿Comó funciona?

El Keystore tiene dos cosas vitales que proteger, la llave en sí, y el valor a como tal, usando keystore significa que no se fugara la llave o la data, dentro de la información de tu aplicación, por que el material de la llave nunca entra al proceso de memoria de tu aplicación. Cuando tu aplicación quiere realizar alguna operación criptográfica, por debajo, el cipher es enviado a un proceso en el sistema que se encarga de llevar estas operaciones de manera segura.

¿Qué son los sistemas con hardware-backed?

Usando Keystore se puede anclar los procesos a un hardware de seguridad, hay demasiados pero en general son: TEE (Trusted execution environment) que son áreas con un proceso insolado de ejecución en el CPU principal y proveen características de seguridad, cuando estos procesos están activados, el material de las llaves nunca será comprometido alrededor de las aplicativos, es decir, si el OS está expuesto o algún atacante pudiera llegar a leer información almacenada del dispositivo, el atacante, podría obtener las llaves del Keystore sin embargo jamás podría extraerlas.

El problema de la encriptación en Android

De alguna manera, la claridad de los procesos de como encriptar y desencriptar no ha sido clara en los últimos años, la cantidad de algoritmos soportados por las diferentes versiones de SDK y los números de bytes soportados por estos algoritmos han sido demasiada información. Por ejemplo, KeyChain API es sobre credenciales generales del sistema, cuando una aplicación solicita acceso a una credencial, el usuario puede elegir qué credencial y que aplicación puede acceder a ella. Sin embargo el Keystore provider permite a una aplicación de manera individual almacenar credenciales que solo esa aplicación puede acceder.

Keystore fue introducido en el API 1 de Android, pero Android Keystore Provider ingreso al mundo de Android hasta el API 18, y en el API 28 Google introdujo StrongBox para dispositivos con chip seguros, que aunque TEE, mencionado arriba es una gran y suficiente solución, este mecanismo utiliza el modelo arquitectónico de Secure Element (SE) que ofrece la solución más segura por que corre el proceso en un chip completamente diferente, es decir, diferente CPU, memoria y almacenaje, diseñado completamente para propósitos de seguridad, usarlo aumentará los tiempos de las operaciones sin embargo, es probablemente la manera más segura de realizar operaciones criptográficas.

En el siguiente gist, podemos observar cómo crear un self-signed certificate y una llave para empezar a usarlo

Key generator

¿Qué lo hace diferente a androidx.security?

No es que KeyStore y Jetpack Security sean diferentes, en realidad son un complemento, la nueva librería usa KeyStore para implementar una operación que consta de dos pasos de llaves y llaves maestras, con la adicción de que podemos encriptar archivos y sharedpreferences de manera sencilla y rápida.

Slides from “Modern Security for Android developers”
  • El primer paso constituye en la parte azul de este diagrama y representa la llave que vamos a crear para encriptar y la data que queremos encriptar, (esto puede ser un archivo o un Shared Preference [Key-Value Map]) esta información sera redondeada por un keyset (la parte verde) que contiene una o más llaves para encriptar la data, el keyset sera almacenado como un share preference
  • La segunda parte del sistema es la parte amarilla que redondea a todas las keyset que tengamos, usaremos una llave maestra para encryptar todos los keysets, esta llave maestra sera almacenada en KeyStore

Para empezar a usar Jetpack security puedes revisar este gist:

Esto crea un master key que sera utilizado en los keysets, MasterKeys es una clase que ayuda a los developers a crear la llave maestra y obtiene un alias para usarlo, la recomendación es usar el algoritmo AES256-GCM que genera una llave simetrica, sin embargo se puede definir una implementación propia con parametros especificos, exactamente como KeyStore API en la parte de arriba, incluyendo tiempos de usabilidad, strongbox y biometricos que seran parte de este serial en la proxima semana.
En la siguiente parte de este serial, discutiremos sobre Archivos y Shared Preferences y como usarlos en JetPack Security.

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