0Pricing
Swift Academy · Leçon

Contrôle d’accès au trousseau

Protégez les éléments par la biométrie et le déverrouillage de l’appareil.

Contrôle d’accès au trousseau est une leçon Swift Academy gratuite sur CoddyKit. Ceci est la leçon 2 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage Swift Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours Swift Academy comprend 4 leçons au total.

Contrôler quand les secrets peuvent être lus

Stocker un secret ne représente que la moitié du travail : vous devez contrôler quand il peut être lu. Le Trousseau propose des classes d’accessibilité et des indicateurs de contrôle d’accès qui protègent les éléments derrière le déverrouillage de l’appareil, le code d’accès ou les données biométriques. Cela protège les données en cas de perte de l’appareil.

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

La clé kSecAttrAccessible

kSecAttrAccessible définit la classe d’accessibilité lors de l’ajout. Elle détermine si un élément est toujours disponible, disponible uniquement après le premier déverrouillage ou seulement lorsque l’appareil est déverrouillé. Choisissez le niveau le plus strict compatible avec votre fonctionnalité.

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 rend l’élément lisible uniquement lorsque l’appareil est déverrouillé. Les tâches en arrière-plan exécutées lorsque l’appareil est verrouillé ne peuvent pas y accéder. Il s’agit du choix par défaut raisonnable pour la plupart des jetons de session.

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

AfterFirstUnlock

kSecAttrAccessibleAfterFirstUnlock conserve l’élément lisible à partir du premier déverrouillage après le démarrage et jusqu’au redémarrage suivant, même lorsque l’appareil est ensuite verrouillé. Utilisez cette option pour les secrets dont un processus en arrière-plan a besoin, comme un jeton servant à gérer les notifications push.

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

Variantes ThisDeviceOnly

Chaque classe d’accessibilité possède une forme ...ThisDeviceOnly. Ces éléments sont exclus des sauvegardes chiffrées et ne sont jamais transférés vers un nouvel appareil. Utilisez-les pour les clés qui ne doivent jamais quitter ce matériel.

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

Lorsqu’un code d’accès est défini

kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly stocke l’élément uniquement si l’utilisateur possède un code d’accès et le supprime si celui-ci est retiré. Cette option garantit que le secret est toujours protégé par un code d’accès.

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

SecAccessControl pour la présence de l’utilisateur

Au-delà de l’état de verrouillage, SecAccessControlCreateWithFlags construit une politique exigeant une authentification active de l’utilisateur — par données biométriques ou par code d’accès — au moment de la lecture. Vous l’associez via kSecAttrAccessControl, à la place de la clé d’accessibilité ou en complément de celle-ci.

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

Indicateurs de contrôle d’accès

Les indicateurs précisent l’exigence : .userPresence autorise les données biométriques ou le code d’accès en solution de secours ; .biometryCurrentSet invalide l’élément si les empreintes ou les visages enregistrés sont modifiés ; .devicePasscode impose la saisie du code d’accès. Combinez-les pour exprimer vos exigences de sécurité.

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

Ajouter un élément protégé

Pour stocker un secret protégé par des données biométriques, placez l’objet SecAccessControl sous kSecAttrAccessControl. Toute lecture ultérieure demande à l’utilisateur de s’authentifier avant de renvoyer les données.

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 lecture demande l’authentification de l’utilisateur

La lecture d’un élément protégé déclenche automatiquement l’interface d’authentification. Vous pouvez fournir une chaîne expliquant la raison via kSecUseOperationPrompt, afin que la demande indique pourquoi l’accès est nécessaire. La lecture reste bloquée jusqu’à ce que l’utilisateur s’authentifie ou annule.

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
}

Choisir le bon niveau

Adaptez la politique au risque :

  • Jeton de session utilisé en arrière-plan : AfterFirstUnlock.
  • Jeton utilisé uniquement par l’interface : WhenUnlocked.
  • Secret de grande valeur : SecAccessControl avec .userPresence et une classe ThisDeviceOnly.

Un niveau plus strict est plus sûr, mais empêche l’accès en arrière-plan : trouvez le bon équilibre.

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

Vérification rapide

Rappelez-vous quelle classe d’accessibilité convient à un secret nécessaire en arrière-plan.

Récapitulatif

Vous avez appris à protéger les éléments du Trousseau :

  • kSecAttrAccessible définit la disponibilité selon l’état de verrouillage : WhenUnlocked, AfterFirstUnlock et les variantes ...ThisDeviceOnly, qui ignorent les sauvegardes.
  • WhenPasscodeSetThisDeviceOnly associe l’élément à la présence d’un code d’accès.
  • SecAccessControl, avec des indicateurs tels que .userPresence ou .biometryCurrentSet, exige une authentification au moment de la lecture.
  • Choisissez le niveau le plus strict qui autorise malgré tout votre mode d’accès.

Questions Fréquemment Posées

La leçon « Contrôle d’accès au trousseau » est-elle gratuite ?

Oui — le texte complet de « Contrôle d’accès au trousseau » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours Swift Academy, passe à CoddyKit PRO. Le cours Swift Academy comprend 4 leçons au total.

Qu'est-ce que j'apprendrai dans « Contrôle d’accès au trousseau » ?

Protégez les éléments par la biométrie et le déverrouillage de l’appareil. Tu pratiques Swift Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.

Dois-je avoir de l'expérience pour commencer Swift Academy ?

Aucune expérience préalable n'est requise. Swift Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 2 sur 4.

Combien de temps prend la leçon « Contrôle d’accès au trousseau » ?

La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.

Peux-tu écrire et exécuter du code dans cette leçon Swift Academy ?

Oui. Chaque leçon Swift Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.

Toutes les leçons de ce cours

  1. Stocker des secrets dans le trousseau
  2. Contrôle d’accès au trousseau
  3. Authentification biométrique
  4. Protection des données et chiffrement
← Retour à Swift Academy