0Pricing
Swift Academy · Lección

Control de acceso a Keychain

Proteja elementos mediante datos biométricos y el desbloqueo del dispositivo.

Control de acceso a Keychain es una lección gratuita de Swift Academy en CoddyKit. Esta es la lección 2 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Swift Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Swift Academy incluye 4 lecciones en total.

Controlar cuándo se pueden leer los secretos

Almacenar un secreto es solo la mitad del trabajo: debe controlar cuándo se puede leer. Keychain ofrece clases de accesibilidad e indicadores de control de acceso que protegen los elementos mediante el desbloqueo del dispositivo, el código o los datos biométricos. Esto protege los datos si se pierde el dispositivo.

import Security
// Two layers of control:
//   kSecAttrAccessible  -> when readable (lock state)
//   SecAccessControl    -> user presence / biometrics

La clave kSecAttrAccessible

kSecAttrAccessible establece la clase de accesibilidad al añadir un elemento. Determina si está disponible siempre, solo después del primer desbloqueo o únicamente mientras el dispositivo está desbloqueado. Elija el nivel más estricto que permita su funcionalidad.

import Security
let query: [String: Any] = [
    kSecClass as String: kSecClassGenericPassword,
    kSecAttrAccount as String: "user",
    kSecValueData as String: Data("secret".utf8),
    kSecAttrAccessible as String:
        kSecAttrAccessibleWhenUnlocked
]
_ = query

WhenUnlocked

kSecAttrAccessibleWhenUnlocked hace que el elemento solo se pueda leer mientras el dispositivo está desbloqueado. Las tareas en segundo plano que se ejecuten mientras está bloqueado no pueden acceder a él. Es la opción predeterminada adecuada para la mayoría de los tokens de sesión.

import Security
// Readable only while unlocked; blocked when locked.
let level = kSecAttrAccessibleWhenUnlocked
_ = level

AfterFirstUnlock

kSecAttrAccessibleAfterFirstUnlock mantiene el elemento legible desde el primer desbloqueo posterior al arranque hasta el siguiente reinicio, incluso mientras el dispositivo vuelve a estar bloqueado. Úselo para secretos que necesite un proceso en segundo plano, como un token para gestionar notificaciones push.

import Security
// Available after the first unlock post-boot,
// including while subsequently locked.
let level = kSecAttrAccessibleAfterFirstUnlock
_ = level

Variantes ThisDeviceOnly

Cada clase de accesibilidad tiene una variante ...ThisDeviceOnly. Estos elementos se excluyen de las copias de seguridad cifradas y nunca se migran a un dispositivo nuevo. Úselas para claves que nunca deban salir de este dispositivo.

import Security
// Never backed up, never migrated:
let local = kSecAttrAccessibleWhenUnlockedThisDeviceOnly
_ = local

Cuando se establece un código

kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly almacena el elemento solo si el usuario tiene un código, y lo elimina si lo quita. Garantiza que el secreto esté siempre protegido por un código.

import Security
let level =
    kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly
// Item vanishes if the user disables their passcode.
_ = level

SecAccessControl para la presencia del usuario

Más allá del estado de bloqueo, SecAccessControlCreateWithFlags crea una política que exige autenticación activa del usuario —datos biométricos o código— en el momento de la lectura. Se vincula mediante kSecAttrAccessControl en lugar de la clave de accesibilidad o junto con ella.

import Security
func makeControl() -> SecAccessControl? {
    return SecAccessControlCreateWithFlags(
        nil,
        kSecAttrAccessibleWhenUnlockedThisDeviceOnly,
        .userPresence,
        nil)
}

Indicadores de control de acceso

Los indicadores precisan el requisito: .userPresence permite usar datos biométricos o recurrir al código; .biometryCurrentSet invalida el elemento si cambian las huellas dactilares o los rostros registrados; .devicePasscode obliga a introducir el código. Combínelos para expresar sus necesidades de seguridad.

import Security
// .userPresence        -> biometric OR passcode
// .biometryAny         -> any enrolled biometric
// .biometryCurrentSet  -> invalidate on biometric change
// .devicePasscode      -> passcode only
let flags: SecAccessControlCreateFlags = [.userPresence]
_ = flags

Añadir un elemento protegido

Para almacenar un secreto protegido por datos biométricos, coloque el objeto SecAccessControl en kSecAttrAccessControl. Cualquier lectura posterior solicita al usuario que se autentique antes de devolver los datos.

import Security
func saveProtected(_ data: Data, account: String,
                   control: SecAccessControl) -> Bool {
    let query: [String: Any] = [
        kSecClass as String: kSecClassGenericPassword,
        kSecAttrAccount as String: account,
        kSecValueData as String: data,
        kSecAttrAccessControl as String: control]
    return SecItemAdd(query as CFDictionary, nil)
        == errSecSuccess
}

La lectura solicita autenticación

Leer un elemento protegido activa automáticamente la interfaz de autenticación. Puede proporcionar una cadena explicativa mediante kSecUseOperationPrompt para que el aviso indique por qué se necesita el acceso. La lectura se bloquea hasta que el usuario se autentica o cancela.

import Security
func readProtected(account: String) -> Data? {
    let query: [String: Any] = [
        kSecClass as String: kSecClassGenericPassword,
        kSecAttrAccount as String: account,
        kSecReturnData as String: true,
        kSecUseOperationPrompt as String:
            String(localized: "Unlock your saved key")]
    var out: CFTypeRef?
    return SecItemCopyMatching(query as CFDictionary,
        &out) == errSecSuccess ? out as? Data : nil
}

Elegir el nivel adecuado

Adapte la política al riesgo:

  • Token de sesión utilizado en segundo plano: AfterFirstUnlock.
  • Token utilizado únicamente en la interfaz: WhenUnlocked.
  • Secreto de gran valor: SecAccessControl con .userPresence y una clase ThisDeviceOnly.

Un nivel más estricto es más seguro, pero impide el acceso en segundo plano; debe encontrar un equilibrio.

import Security
// High-value: biometric-gated, device-bound, no backup
let control = SecAccessControlCreateWithFlags(
    nil,
    kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly,
    .userPresence, nil)
_ = control

Comprobación rápida

Recuerde qué clase de accesibilidad es adecuada para un secreto que se necesita en segundo plano.

Resumen

Ha aprendido a controlar el acceso a los elementos de Keychain:

  • kSecAttrAccessible establece la disponibilidad según el estado de bloqueo: WhenUnlocked, AfterFirstUnlock y las variantes ...ThisDeviceOnly, que omiten las copias de seguridad.
  • WhenPasscodeSetThisDeviceOnly vincula el elemento a la existencia de un código.
  • SecAccessControl, con indicadores como .userPresence o .biometryCurrentSet, exige autenticación en el momento de la lectura.
  • Elija el nivel más estricto que siga permitiendo su patrón de acceso.

Preguntas frecuentes

¿La lección «Control de acceso a Keychain» es gratis?

Sí — el texto completo de «Control de acceso a Keychain» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Swift Academy, actualiza a CoddyKit PRO. El curso de Swift Academy incluye 4 lecciones en total.

¿Qué aprenderé en «Control de acceso a Keychain»?

Proteja elementos mediante datos biométricos y el desbloqueo del dispositivo. Practicas Swift Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar Swift Academy?

No se requiere experiencia previa. Swift Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 2 de 4.

¿Cuánto tiempo toma la lección «Control de acceso a Keychain»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de Swift Academy?

Sí. Cada lección de Swift Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. Almacenar secretos en Keychain
  2. Control de acceso a Keychain
  3. Autenticación biométrica
  4. Protección de datos y cifrado
← Volver a Swift Academy