
Descripción general de la protección de datos de llavero
Muchas apps necesitan gestionar contraseñas y otros datos de pequeño tamaño pero confidenciales, como las claves o los identificadores de inicio de sesión. El llavero de iOS y iPadOS constituye un sistema seguro para almacenar estos ítems.
Los ítems del llavero se encriptan con dos claves AES-256-GCM distintas, una clave de tabla (metadatos) y una clave por fila (clave secreta). Los metadatos del llavero (todos los atributos excepto kSecValue) se encriptan con la clave de metadatos para agilizar las búsquedas, mientras que el valor secreto (kSecValueData) se encripta con la clave secreta. La clave de metadatos está protegida por Secure Enclave, pero se almacena en caché en el procesador de aplicaciones para permitir realizar consultas rápidas del llavero. La clave secreta siempre requiere un ciclo de ida y vuelta por Secure Enclave.
El llavero se implementa como una base de datos SQLite, almacenada en el sistema de archivos. Solo hay una base de datos y el demonio securityd
determina a qué ítems del llavero puede acceder a cada proceso o app. Las API de acceso a llaveros generan llamadas al demonio, que envía una consulta a las autorizaciones “Keychain‑access‑groups”, “application‑identifier” y “application‑group” de la app. En lugar de limitar el acceso a un solo proceso, los grupos de acceso permiten que los ítems del llavero se compartan entre apps.
Los ítems del llavero solo se pueden compartir entre las apps de un mismo desarrollador. Esto se gestiona solicitando a las apps de terceros que utilicen grupos de acceso con un prefijo asignado a través del programa para desarrolladores de Apple (Apple Developer Program) mediante grupos de aplicaciones. El requisito de prefijo y la exclusividad del grupo de aplicaciones se aplican mediante la firma de código, perfiles de datos y el programa para desarrolladores de Apple.
Los datos de llavero se protegen con una estructura de clases similar a la utilizada en la protección de datos de archivo. Estas clases tienen comportamientos equivalentes a las clases de protección de datos de archivo, pero utilizan claves distintas y forman parte de las API con nombres diferentes.
Disponibilidad | Protección de datos de archivo | Protección de datos de llavero |
---|---|---|
Cuando está desbloqueado | NSFileProtectionComplete | kSecAttrAccessibleWhenUnlocked |
Cuando está bloqueado | NSFileProtectionCompleteUnless Open | N/A |
Tras el primer desbloqueo | NSFileProtectionCompleteUntil FirstUserAuthentication | kSecAttrAccessibleAfterFirstUnlock |
Siempre | NSFileProtectionNone | kSecAttrAccessibleAlways |
Código activado | N/A | kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly |
Las apps que utilizan servicios de actualización en segundo plano pueden usar kSecAttrAccessibleAfterFirstUnlock para los ítems del llavero a los que es necesario acceder durante este tipo de actualizaciones.
La clase kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly muestra el mismo comportamiento que kSecAttrAccessibleWhenUnlocked, pero solo está disponible cuando el dispositivo está configurado con un código. Estas clases solo existen en el repositorio de claves del sistema y:
No se sincronizan con el llavero de iCloud.
No se realiza una copia de seguridad de ellas.
No se incluyen en repositorios de claves de custodia.
Si se elimina o restablece el código, se descartan las claves de clase y los ítems dejan de ser útiles.
Otras clases de llavero tienen un equivalente a “Solo este dispositivo”, que siempre está bajo la protección del UID cuando se copia del dispositivo durante la copia de seguridad, de modo que deja de ser útil si se restaura en un dispositivo diferente. Apple ha equilibrado la seguridad y la usabilidad cuidadosamente mediante la selección de clases de llavero que dependen del tipo de información que se esté protegiendo y de cuándo la necesite iOS y iPadOS. Por ejemplo, un certificado VPN debe estar disponible en todo momento para que el dispositivo esté continuamente conectado, pero se clasifica como “no migrable” para evitar que se pueda trasladar a otro dispositivo.