Aplicaciones seguras en iOS, Parte 3: Bases de datos

El mundo es cada día un lugar más conectado. En todo momento podemos consultar Internet para buscar y modificar la información que necesitamos. A pesar de esto, utilizar nuestra aplicación en modo offline o guardar información para acceder a ella después (por ejemplo un catálogo de productos o listas de clientes, historiales de chat, etc.) es a veces necesario y, para lograrlo, necesitamos una base de datos.

Como una ventaja adicional, una vez que el dispositivo móvil se encuentre conectado a Internet las copias de seguridad de iOS entrarán en acción y sincronizarán los datos de la aplicación si es que la configuración de respaldo así lo indica.

En una aplicación de chat necesitamos almacenar nuestras conversaciones usando una base de datos. Imagen: Megan Fox

Pero, ¿qué pasa si nuestra aplicación móvil guarda contenido sensible? La base de datos de una aplicación de mensajería es un gran ejemplo: Si los datos de respaldo de iCloud fueran copiados por otras personas (cosa que ya ha pasado) entonces la copia de la base de datos también se vería afectada. El historial de las conversaciones en el chat quedaría expuesto.

Por eso, debido a que no podemos controlar las políticas de respaldos de seguridad que nuestros usuarios configuren, cifrar la base de datos resulta una opción para que la información permanezca segura aún cuando exista una copia de respaldo fuera del dispositivo.

Realm


Con un alcance multiplataforma, Realm es una base de datos mobile-first. Sin limitarse al cifrado, Realm ofrece muchas características que encontramos útiles para los desarrolladores de aplicaciones. Sin embargo, la tecnología de cifrado de datos resalta en Realm porque ocurre a bajo nivel, a diferencia de opciones como SQLCipher**, que pueden ser vistos de cierta forma como “plugins” sobre la base de datos.

El cifrado de la base de datos requiere una llave de 64 bits para guardar los datos. Por supuesto que la llave de cifrado es la garantía de la seguridad de nuestros datos.

Por eso, la llave debe cumplir con una serie de requisitos:

  1. Debe ser diferente para cada instancia de nuestra aplicación, generada al azar dentro del dispositivo.
  2. Debe también estar fuera del alcance del usuario (no hacer eso sería como construir una fortaleza y dejar la puerta abierta) y, además,
  3. No puede cambiar una vez creada, pues se perdería el acceso a los datos guardados previamente.

De forma que para cumplir con estos puntos usaremos el Keychain de iOS para guarda la llave de cifrado.

Por si te lo perdiste, en la entrega anterior de esta serie hablé sobre esta herramienta:

Lo que tenemos que hacer, entonces, es implementar una categoría a la clase RLMRealm para poder tener acceso a un nuevo método, que se escribe como:

La implementación de la categoría RLMRealm+encryptedRealm.h.

De esa forma la base de datos cifrada puede ser usada por nuestra aplicación:

RLMRealm *realm = [RLMRealm encryptedRealm];

Todo lo demás en la aplicación queda forma igual a una aplicación sin cifrado, de manera que las consultas y adiciones a la base de datos no sufren ninguna modifica ción con el uso de una instancia cifrada de Realm.

La aplicación de ToDo’s mostrada aquí está usando una instancia cifrada de Realm. Puedes revisar el código fuente en Github en este enlace.

La aplicación de tareas pendientes mostrada arriba no requiere ningún cambio adicional a la lógica que la controla salvo la instancia cifrada de Realm. Por eso, resultaría muy sencillo usar una base de datos cifrada en una aplicación funcional aún cuando no haya sido planeado desde un inicio.

Para finalizar esta entrega puedo decir que el impacto en la velocidad de la aplicación es apenas perceptible para el usuario. La documentación de Realm indica que el impacto en el rendimiento es, por lo general, menor a 10%. Tenemos seguridad sin sacrificar nada más ¡Genial!

Escrito por Orlando Sánchez. Desarrollador Fullstack/iOS en Jaque

** Ve el minuto 22:10 de la presentación en https://realm.io/news/jp-simard-realm-core-database-engine/

Like what you read? Give Jaque a round of applause.

From a quick cheer to a standing ovation, clap to show how much you enjoyed this story.