La seguridad en Android es uno de los temas principales de preocupación para usuarios y desarrolladores, y uno de los asuntos en los que más ha trabajado Google en los últimos años. Concretamente, nos preocupa el hecho de cómo almacenar información sensible en nuestros dispositivos móviles.

Android keystore como almacenamiento seguro

El ejemplo vivo de ello es precisamente el Android keystore, un sistema de almacenamiento de credenciales seguros a nivel de sistema operativo. De esta forma, podremos crear un nuevo par de claves privada y pública y utilizarla para encriptar claves de aplicaciones de forma segura.

Pero el keystore no es precisamente un mecanismo para guardar claves directamente. Se trata de un contenedor seguro, que puede ser utilizado por las aplicaciones para almacenar claves privadas. Y lo interesante aquí es que cada aplicación sólo podrá conseguir las claves asociadas a sí misma, no las de otras aplicaciones.

Además, la propia pantalla de bloqueo del usuario es utilizada para encriptar la Keystore, por lo que cuando la pantalla está desbloqueada, dicha información está inaccesible, lo que debería llevarnos a pensar como desarrolladores en que esta información no estaría accesible en servicios en segundo plano.

Este mecanismo fue introducido en Android 4.3 (API 18), aunque el concepto de Keystore ya fue introducido desde el origen de Android, aunque por entonces restringido a VPN y WiFis.

Utilizando la Keystore de Android

La mejor manera de entender este mecanismo es sabiendo utilizar dicha Keystore como programadores.

Para ello, debemos tener claro en primer lugar que debemos conseguir una referencia a la Keystore, la cual inicializamos:

Keystore.getInstance("AndroidKeyStore");
keystore.load(null)

Una vez hecho esto, ya podríamos empezar por ejemplo a listar las claves, para lo cual podríamos utilizar un método como el siguiente:

private void refreshKeys() {
        keyAliases = new ArrayList<>();
        try {
            Enumeration<String> aliases = keyStore.aliases();
            while (aliases.hasMoreElements()) {
                keyAliases.add(aliases.nextElement());
            }
        }
        catch(Exception e) {}

        if(listAdapter != null)
            listAdapter.notifyDataSetChanged();
}

Aunque también podríamos añadir nuevas claves, para lo que necesitaríamos utilizar un KeyPairGenerator, el cual nos permite crear nuevos pares de claves:

    public void createNewKeys(View view) {
        String alias = aliasText.getText().toString();
        try {
            // Create new key if needed
            if (!keyStore.containsAlias(alias)) {
                Calendar start = Calendar.getInstance();
                Calendar end = Calendar.getInstance();
                end.add(Calendar.YEAR, 1);
                KeyPairGeneratorSpec spec = new KeyPairGeneratorSpec.Builder(this)
                        .setAlias(alias)
                        .setSubject(new X500Principal("CN=Sample Name, O=Android Authority"))
                        .setSerialNumber(BigInteger.ONE)
                        .setStartDate(start.getTime())
                        .setEndDate(end.getTime())
                        .build();
                KeyPairGenerator generator = KeyPairGenerator.getInstance("RSA", "AndroidKeyStore");
                generator.initialize(spec);

                KeyPair keyPair = generator.generateKeyPair();
            }
        } catch (Exception e) {
            Toast.makeText(this, "Exception " + e.getMessage() + " occured", Toast.LENGTH_LONG).show();
            Log.e(TAG, Log.getStackTraceString(e));
        }
        refreshKeys();
    }

También podríamos eliminar claves con tan sólo llamar al método deleteEntry. Además podemos encriptar y desencriptar texto utilizando la clave pública, entre otras opciones.

Pero si quieres entrar a fondo en este tema, lo mejor que puedes hacer es acudir a este completo ejemplo de código para utilizar la KeyStore de Android:

SimpleKeystoreApp en GitHub

¿A qué esperas para empezar a jugar con el código y aprender sobre este mecanismo de seguridad que tantas posibilidades ofrece?

Vía AndroidAuthority