Gestión de Keychains para Almacenamiento Seguro de Contraseñas
Clase 28 de 31 • Curso de Integración Nativa iOS
Resumen
¿Qué es y para qué sirve el Keychain?
Almacenar información sensible de manera local y segura es esencial en el desarrollo de aplicaciones. Aquí es donde entra el concepto de "Keychain". Este mecanismo te permite guardar información en un formato clave-valor, generalmente encriptada, ideal para manejar inicios de sesión, contraseñas y cualquier otro dato que necesite protección adicional. En resumen, los Keychains son fundamentales para mantener segura tu aplicación.
¿Cómo implementamos el uso de Keychain?
En el proyecto de ejemplo, tenemos una vista con un diseño básico que incluye botones para guardar, listar y eliminar tokens, además de un área donde se muestran estos tokens. Sin embargo, para gestionar estos tokens, necesitamos una clase específica, conocida como "KeyChainManager".
¿Cómo creamos la clase KeyChainManager?
La gestión de Keychain comienza con la creación de una clase llamada KeyChainManager
. Esta clase utiliza Foundation
, una herramienta que proporciona las clases necesarias para trabajar con Keychains. Lo primero que debes hacer es crear una instancia compartida para acceder a la clase desde cualquier parte de la aplicación.
import Foundation
class KeyChainManager {
static let shared = KeyChainManager()
// Aquí se define la clase y los métodos que necesitas
}
¿Cómo almacenamos valores en el Keychain?
Una vez tenemos la instancia compartida, necesitamos crear funciones para guardar, obtener y eliminar datos en el Keychain.
-
Función para guardar datos: Se necesita una clave y un valor, ambos en formato
String
. La función devuelve un booleano que indica si la operación fue exitosa. -
Conversión a formato UTF-8: El valor que ingresa se debe convertir a este formato para poder ser encriptado y almacenado.
-
Creación de un diccionario de consulta: Define parámetros como el tipo de dato que se está guardando, en este caso, una contraseña genérica, utilizando
kSecClassGenericPassword
. -
Agregando el valor al Keychain:
var query: [String: Any] = [kSecClass as String: kSecClassGenericPassword, kSecAttrAccount as String: key, kSecValueData as String: data]
-
Verifica existencia previa: Si ya hay un valor almacenado con la misma clave, es necesario eliminarlo antes de agregar el nuevo.
-
Guardar el nuevo valor: Usa
SecItemAdd
para añadir el elemento al Keychain.
¿Cómo se obtienen valores desde el Keychain?
Para recuperar valores, se define un nuevo diccionario de consulta, especificando el tipo de dato y la clave buscada. La función busca devolver el valor en formato String
.
var query: [String: Any] = [kSecClass as String: kSecClassGenericPassword,
kSecAttrAccount as String: key,
kSecReturnData as String: kCFBooleanTrue!,
kSecMatchLimit as String: kSecMatchLimitOne]
¿Cómo podemos eliminar valores del Keychain?
La eliminación de un valor es similar a la obtención. Envía los parámetros del diccionario de consulta para identificar cuál es el elemento que se quiere eliminar.
¿Cómo diseñamos la interfaz para usar el Keychain?
El diseño básico interactúa con el usuario para almacenar, listar o eliminar tokens:
-
Variables de Estado: Se crean variables de estado para manejar el token actual, el token introducido por el usuario y la lista de claves almacenadas.
-
Interfaz Gráfica:
- Implementa un
TextField
donde se ingresa el token. - Botones para guardar, listar y eliminar tokens.
- Implementa un
-
Acciones de los Botones:
- Al guardar, genera una clave única usando
UUID
. - Al listar, recupera todos los tokens y los muestra.
- Al eliminar, elimina todos los tokens y limpia la lista localmente.
- Al guardar, genera una clave única usando
Este tipo de implementación no solo es un ejercicio práctico de programación, sino también un ejemplo de buenas prácticas para gestionar datos sensibles en tus aplicaciones.