La persistencia de datos es uno de los puntos más importantes a la hora de desarrollar software, ya que, es probable que esto agilice algunos procesos por ejemplo: mostrar catálogos, datos de usuario, historial de compras, etc. En general datos que sean  dinámicos y para hacerlo posible basta con usar una base de datos local. Pero existen datos sensibles que es poco recomendable guardarlos ahí, para esto, Apple creó KeyChain que lo define como: Un contenedor bloqueado y encriptado (usando claves AES-256-GCM, una clave de tabla (metadatos) y una clave por fila (clave secreta)) que es utilizado por las aplicaciones KeyChain y iCloud para guardar datos de usuario y contraseñas.

Este mismo sistema de seguridad de datos puede ser utilizado en aplicaciones móviles para guardar datos muy sensibles como números o pins de cuentas bancarias, datos de usuario o access tokens para poder consumir datos de la API.

¿Cómo gestionar datos en el KeyChain desde una aplicación?

Escribir el código para hacerlo no es cosa fácil, debido a que la API para keychain de Apple es un poco compleja de entender y de utilizar. Es por eso que en este post hablaremos de la librería keychain-swift que contiene un conjunto de funciones cortas e intuitivas que facilitan el uso de este sistema de seguridad dentro de aplicaciones móviles.

Existen 3 maneras de agregar esta librería a un proyecto de Xcode y son las siguientes:

  1. Agregar el archivo que contiene el código de las funciones que ofrece la librería en tu proyecto de Xcode.
  2. Integrarlo con Cartage. github "evgenyneu/keychain-swift" ~> 19.0
  3. Integrarlo con CocoaPods. pod 'KeychainSwift', '~> 19.0’

Después de agregarla, para poder utilizarla simplemente en la sección de imports regularmente ubicada en la cabecera de los archivos se deberá agregar la siguiente linea: import KeychainSwift y con esto se podrán utilizar todas la funciones que nos ofrece la librería.

Finalmente, para guardar texto en el KeyChain desde la aplicación simplemente se debe crear una instancia de  la clase KeyChainSwift y utilizar el método set, además de poner una llave o nombre que servirá como identificador del valor guardado, como se muestra a continuación:

let keychain = KeychainSwift()

keychain.set("hello world", forKey: "my key”)

Una vez guardada la información, es muy fácil consultarla simplemente se debe poner la llave o nombre con el que fue guardado, por ejemplo:

keychain.get("my key”)

También es posible eliminar la información guardada, este es un proceso muy sencillo ya que solo se debe indicar la llave o nombre que se indicó cuando la información fue guardada, por ejemplo:

keychain.delete("my key”)

Características adicionales de KeyChainSwift

Aunque la gestión de información como se mencionó anteriormente en la mayoría de los ocasiones en más que suficiente, esta librería permite hacer un poco más con la información por ejemplo:

  • Agregar niveles de seguridad específicos para cada valor guardado. Para conocer más sobre el tema, se les invita a visitar el siguiente link: https://github.com/evgenyneu/keychain-swift/blob/master/Sources/KeychainSwiftAccessOptions.swift.
  • Compartir datos guardados con múltiples dispositivos, para esto, simplemente se debe poner como true la propiedad synchronizable que está disponible en la instancia de la clase KeyChainSwift. Es importante que esta propiedad se “active” en todos los dispositivos que compartirán o consultarán la información.
  • Crear un KeyChain grupal, es posible con esta librería no compartir cada ítem, aunque para esto se requiere de una configuración adicional en tu proyecto de Xcode, acá dejamos el tutorial para utilizar esta característica: https://evgenii.com/blog/sharing-keychain-in-ios/
  • Realizar alguna operación de gestión dentro de una función que permite saber si la operación se realizó con éxito o no.
  • Es posible configurar un prefijo con el cual se guardarán los datos y de esta manera tener mejor estructura en el nombrado de la información.

Para concluir, cabe mencionar que la importancia de resguardar información sensible de una manera segura es simplemente algo que NO se debe tomar a la ligera a la hora de desarrollar una aplicación móvil, y, para el caso de plataformas Apple no hay mejor sitio para esto que el KeyChain, ya que los datos almacenado aquí son tan seguros que incluso no es posible obtenerlos aunque se realice una copia de seguridad del dispositivo o del sistema de archivos.

Es importante que se analice un poco la información que se guardará y se determiné si es o no sensible ya que Apple recomienda que solo se guarden pequeñas cantidades de información.

Documentación oficial

https://github.com/evgenyneu/keychain-swift

Keychain Apple documentation

https://developer.apple.com/documentation/security/keychain_services

Encriptación en KeyChain

https://support.apple.com/es-mx/guide/security/secb0694df1a/web