Keychain — Conceptos clave, arquitectura y cómo funciona

Autor: IT Sectr Publicado: 2026-03-14 Tiempo de lectura: 10 min

Keychain es un almacenamiento seguro de credenciales en iOS, watchOS, macOS y tvOS que gestiona contraseñas, claves y certificados a nivel de hardware. A diferencia de UserDefaults, los datos en Keychain se cifran y se aíslan por zona de pruebas de la aplicación. Según Apple Developer Documentation, Keychain utiliza mecanismos de Secure Enclave y cifrado hardware AES-256 para proteger información confidencial.

Puntos clave

  • Keychain — almacenamiento del sistema iOS para contraseñas, claves y certificados con cifrado hardware
  • Security framework proporciona funciones C SecItemAdd, SecItemCopyMatching y SecItemDelete para trabajar con Keychain
  • El acceso a Keychain está limitado por la zona de pruebas de la aplicación, pero es posible el acceso compartido mediante keychain access groups
  • El atributo kSecAttrAccessible define el nivel de protección: desde Always hasta WhenUnlockedThisDeviceOnly
  • Keychain admite el almacenamiento de contraseñas, claves simétricas y asimétricas, certificados X.509

¿Qué es Keychain?

Keychain es una base de datos segura del sistema operativo Apple diseñada para el almacenamiento seguro de contraseñas, claves criptográficas, certificados y otros datos confidenciales. Keychain apareció por primera vez en Mac OS 8.6 en 1999, y en iOS — desde la primera versión del SDK.

Definición y propósito

Keychain resuelve un problema fundamental del desarrollo móvil: almacenar secretos (tokens, contraseñas, claves de cifrado) en un sistema de archivos no seguro. A diferencia de UserDefaults o SQLite, los datos en Keychain se almacenan cifrados y se cifran automáticamente al escribirse en el disco.

Cada aplicación iOS funciona en una zona de pruebas aislada y solo tiene acceso a su propio keychain. Sin embargo, el desarrollador puede configurar el acceso compartido a Keychain entre aplicaciones del mismo desarrollador mediante keychain access groups. El iCloud Keychain del usuario sincroniza adicionalmente los datos entre dispositivos mediante cifrado de extremo a extremo.

Según Apple Security White Paper (2025), Keychain utiliza cifrado hardware AES-256 con una clave vinculada al identificador único del dispositivo (UID), lo que hace que los datos sean inaccesibles al extraerlos del dispositivo.

¿Cómo funciona Keychain en iOS?

Keychain funciona como un servicio por capas: la aplicación accede al Security framework, que se comunica con el demonio securityd que gestiona la base de datos SQLite cifrada de Keychain. Cada registro se cifra con una clave separada, y las claves están protegidas por el módulo hardware Secure Enclave en dispositivos con chip A7 y posteriores.

Arquitectura de Security framework

Security framework proporciona una interfaz C para trabajar con Keychain Services. Funciones principales: SecItemAdd (añadir), SecItemCopyMatching (buscar), SecItemUpdate (actualizar) y SecItemDelete (eliminar). Cada operación acepta un diccionario de atributos CFDictionaryRef que describe el tipo de solicitud.

Los datos se clasifican por clases: kSecClassGenericPassword (contraseña arbitraria), kSecClassInternetPassword (contraseña de servicio de internet), kSecClassCertificate (certificado), kSecClassKey (clave criptográfica) y kSecClassIdentity (par clave-certificado).

Proceso de guardado de datos

Al guardar una contraseña, la aplicación crea un diccionario con atributos: servicio, cuenta, nivel de acceso, etiqueta. Security framework pasa los datos al demonio securityd, que cifra el registro con una clave vinculada al dispositivo y lo almacena en la base SQLite de Keychain. La recuperación funciona de manera similar: consulta por atributos, búsqueda, descifrado y devolución de datos.

Una característica importante: al eliminar una aplicación, iOS automáticamente borra los registros de Keychain creados por esa aplicación (desde iOS 10.3+). Al reinstalar la aplicación, los datos de Keychain de la instalación anterior no están disponibles a menos que se haya utilizado iCloud Keychain.

swift
import Security

func savePassword(service: String, account: String, password: Data) {
    let query: [String: Any] = [
        kSecClass as String: kSecClassGenericPassword,
        kSecAttrService as String: service,
        kSecAttrAccount as String: account,
        kSecValueData as String: password,
        kSecAttrAccessible as String: kSecAttrAccessibleWhenUnlocked
    ]
    SecItemAdd(query as CFDictionary, nil)
}

Tipos de datos en Keychain

Keychain admite cinco clases principales de datos, cada una con su propio conjunto de atributos y ámbito de aplicación. La elección de la clase determina qué claves de búsqueda están disponibles y cómo se cifran los datos.

Contraseñas y cuentas

Las clases kSecClassGenericPassword y kSecClassInternetPassword están diseñadas para almacenar contraseñas de texto. La versión de Internet almacena además datos del servidor: dominio, protocolo, puerto y ruta de autenticación. GenericPassword se utiliza para almacenar cualquier contraseña sin vinculación al servidor.

Al guardar una contraseña de internet, se puede especificar kSecAttrServer (dominio), kSecAttrProtocol (HTTPS, FTP, etc.), kSecAttrPort y kSecAttrPath. Esto permite identificar con precisión el registro durante el llenado automático mediante AutoFill.

Claves criptográficas y certificados

La clase kSecClassKey almacena claves simétricas (AES) y asimétricas (RSA, EC). La clase kSecClassCertificate almacena certificados X.509. La clase kSecClassIdentity combina una clave privada y su certificado correspondiente en un solo registro.

Para claves asimétricas, Keychain admite atributos: kSecAttrKeyType (RSA, EC), kSecAttrKeySizeInBits (2048, 256), kSecAttrIsPermanent (guardar en Keychain). Para certificados: kSecAttrLabel (nombre legible), kSecAttrSubject (DN del propietario), kSecAttrIssuer (DN del emisor).

Clase de KeychainPropósitoTipo de dato
kSecClassGenericPasswordContraseña de aplicaciónData (NSString)
kSecClassInternetPasswordContraseña de servidorData + atributos de servidor
kSecClassCertificateCertificado X.509SecCertificate
kSecClassKeyClave criptográficaSecKey
kSecClassIdentityClave + certificadoSecIdentity

Trabajar con Keychain a través de la API

La interfaz principal para interactuar con Keychain en código nativo de iOS son las funciones de Security framework. Para Swift y Objective-C, está disponible una única interfaz C, envuelta en funciones convenientes.

Operaciones básicas SecItemAdd y SecItemCopyMatching

La función SecItemAdd añade un nuevo elemento a Keychain. Toma como entrada un diccionario con clase, datos y atributos. Devuelve el estado errSecSuccess (0) o un código de error. La función SecItemCopyMatching realiza una búsqueda por atributos y devuelve los datos encontrados.

Para la búsqueda se utiliza el indicador kSecReturnData — si es true, la función devuelve el contenido del registro. El indicador kSecMatchLimit determina el número de resultados: kSecMatchLimitOne (uno) o kSecMatchLimitAll (todos).

swift
func readPassword(service: String, account: String) -> Data? {
    let query: [String: Any] = [
        kSecClass as String: kSecClassGenericPassword,
        kSecAttrService as String: service,
        kSecAttrAccount as String: account,
        kSecReturnData as String: true,
        kSecMatchLimit as String: kSecMatchLimitOne
    ]
    var item: CFTypeRef?
    let status = SecItemCopyMatching(query as CFDictionary, &item)
    guard status == errSecSuccess else { return nil }
    return item as? Data
}

Eliminación y actualización de registros

SecItemUpdate permite cambiar atributos o datos de un registro existente. SecItemDelete elimina todos los registros que coinciden con el diccionario pasado. Al eliminar, es importante especificar suficientes atributos para no eliminar accidentalmente registros de otros en el keychain compartido.

swift
func deletePassword(service: String, account: String) {
    let query: [String: Any] = [
        kSecClass as String: kSecClassGenericPassword,
        kSecAttrService as String: service,
        kSecAttrAccount as String: account
    ]
    SecItemDelete(query as CFDictionary)
}

Niveles de acceso y protección de datos

Cada registro de Keychain tiene el atributo kSecAttrAccessible, que determina cuándo los datos están disponibles para lectura. Esto es críticamente importante para la seguridad: un nivel de acceso incorrecto puede hacer que los datos sean vulnerables o, por el contrario, no estén disponibles cuando se necesiten.

Constantes de accesibilidad

kSecAttrAccessibleWhenUnlocked — los datos solo están disponibles cuando el dispositivo está desbloqueado. kSecAttrAccessibleAfterFirstUnlock — disponibles después del primer desbloqueo tras el reinicio. kSecAttrAccessibleAlways — siempre disponibles (no recomendado). El sufijo ThisDeviceOnly impide la transferencia de datos mediante copia de seguridad.

En dispositivos con Secure Enclave, la clave de cifrado de Keychain puede protegerse adicionalmente con biometría: kSecAccessControlBiometryCurrentSet o kSecAccessControlUserPresence. Esto añade un requisito de Face ID o Touch ID para cada operación de lectura.

iCloud Keychain y sincronización

iCloud Keychain sincroniza registros entre dispositivos Apple mediante cifrado de extremo a extremo. Apple no tiene acceso a los datos descifrados. Para habilitar la sincronización, añada el atributo kSecAttrSynchronizable con el valor kCFBooleanTrue.

Importante: los registros sincronizados no pueden contener el atributo ThisDeviceOnly, ya que deben estar disponibles en otros dispositivos. Si se pierden todos los dispositivos, iCloud Keychain se puede restaurar mediante un código de recuperación o una clave de recuperación de iCloud.

Mejores prácticas para elegir el nivel de acceso

Para tokens de autenticación, use kSecAttrAccessibleWhenUnlockedThisDeviceOnly — los datos solo están disponibles cuando el dispositivo está desbloqueado y no se copian en las copias de seguridad. Para certificados que deben estar disponibles para tareas en segundo plano, use kSecAttrAccessibleAfterFirstUnlock. Nunca use kSecAttrAccessibleAlways para datos confidenciales.

Se recomienda añadir siempre el sufijo ThisDeviceOnly para datos que no requieren sincronización. Esto evita la copia accidental de secretos a iCloud o iTunes backup, donde podrían ser extraídos por herramientas de análisis. Para datos críticos, combine la accesibilidad con kSecAccessControlUserPresence — esto añade un requisito biométrico o de código para el descifrado del registro.

Al usar iCloud Keychain, tenga en cuenta que los registros sincronizados están disponibles en todos los dispositivos del usuario: si un atacante obtiene acceso a un dispositivo, los datos podrían verse comprometidos en todos. Para secretos aislados, use ThisDeviceOnly.

Preguntas frecuentes

¿En qué se diferencia Keychain de UserDefaults?

UserDefaults almacena datos en texto plano en un archivo .plist, accesible durante el análisis del IPA. Keychain cifra cada registro por separado, utiliza cifrado hardware y admite niveles de acceso, biometría y sincronización a través de iCloud.

¿Cómo limpiar Keychain durante las pruebas?

En cada inicio del simulador de iOS, Keychain se limpia. En un dispositivo real, elimine la aplicación — iOS eliminará todos los registros de Keychain de ese desarrollador. Para una limpieza selectiva, llame a SecItemDelete con los atributos correspondientes.

¿Pueden dos aplicaciones compartir un mismo Keychain?

Sí, a través de keychain access groups. Las aplicaciones deben tener el mismo team ID en el perfil de aprovisionamiento y entitlements con el mismo keychain-access-groups. El desarrollador configura el acceso compartido en Xcode Capabilities.

¿Cuál es el tamaño máximo de datos en Keychain?

Apple no documenta un límite estricto, pero en la práctica se recomienda no superar 1–4 KB por registro. Para volúmenes mayores, use cifrado de archivos y almacene la clave en Keychain, mientras que los datos en Documents.

¿Es seguro Keychain en un dispositivo con jailbreak?

En un dispositivo con jailbreak, la protección de Keychain se reduce porque el atacante obtiene acceso root y puede leer la base de datos SQLite de Keychain directamente. Para datos críticos, use cifrado adicional con una clave obtenida del servidor.

Resumen

  • Keychain — almacenamiento seguro de iOS para contraseñas, claves y certificados con cifrado hardware AES-256
  • Security framework proporciona C-API: SecItemAdd para escritura, SecItemCopyMatching para lectura, SecItemDelete para eliminación
  • Clases de datos de Keychain: GenericPassword, InternetPassword, Certificate, Key, Identity — cada una con su propio conjunto de atributos
  • kSecAttrAccessible controla el nivel de acceso: WhenUnlocked, AfterFirstUnlock, Always, con la opción ThisDeviceOnly
  • iCloud Keychain sincroniza registros entre dispositivos mediante cifrado de extremo a extremo con el atributo kSecAttrSynchronizable
  • Biometría (Face ID / Touch ID) protege el acceso a Keychain mediante kSecAccessControlBiometryCurrentSet
  • Use Keychain para almacenar tokens OAuth, contraseñas y claves criptográficas — no almacene secretos en UserDefaults

Desarrollaremos una aplicación móvil llave en mano

IT Sectr crea aplicaciones para iOS y Android para startups y empresas desde 2017. Le asesoraremos y le propondremos la mejor solución.

Discutir el proyecto

Lea también