Table of Contents
Présentation
La création de systèmes d'authentification sécurisés pour les applications iOS est une responsabilité fondamentale pour les développeurs. Avec la montée des cybermenaces sophistiquées, une vulnérabilité unique dans le flux de connexion peut exposer les données sensibles des utilisateurs, nuire à la réputation de la marque et conduire à des sanctions réglementaires. L'écosystème Apple offre de puissants cadres de sécurité, mais leur mise à profit nécessite une compréhension approfondie des meilleures pratiques.
Mettre en œuvre des méthodes d'authentification solides
Les attaquants utilisent souvent des techniques de rembourrage, d'hameçonnage ou de force brute pour compromettre les comptes. Pour atténuer ces risques, vous devriez adopter des protocoles d'authentification multifacteurs (AMF) et d'identité moderne.
Authentification multi-facteurs (AMF)
Pour les applications iOS, l'intégration de MFA peut être réalisée par des mots de passe ponctuels (TOTP) générés par des applications authentificateurs, des demandes d'approbation par poussée ou des codes SMS (bien que les SMS soient de plus en plus découragés par les attaques SIM-swapping). Apple AuthentificationServices[ prend en charge le ASAutorisationController pour gérer les flux MFA, mais vous devez gérer attentivement les durées de vie des jetons et l'authentification par étapes basée sur le risque. Par exemple, n'exiger MFA que lors d'actions à haut risque (p. ex., changements de mot de passe ou accès à des données sensibles) pour éviter les frictions pendant les connexions normales.
OAuth 2.0 et OpenID Connect
Ces protocoles permettent à votre application de déléguer l'authentification à des fournisseurs de confiance (Apple, Google ou votre propre serveur d'autorisation) tout en maintenant un contrôle finement adapté sur les champs et les autorisations. Lors de la mise en œuvre d'OAuth 2.0 sur iOS, utilisez ASWebAuthentificationSession ou le nouveau ASAutorizationController[ pour présenter des sessions de navigateur sécurisées et gérées par système. Cela empêche l'interception de la crédibilité par des applications malveillantes et permet aux utilisateurs de voir la page de connexion légitime du fournisseur.
En savoir plus sur PKCE et son importance pour les applications mobiles.
Stockage sécurisé des pouvoirs
Toute identification, jetons ou clés cryptographiques stockées sur l'appareil doit être protégée contre un accès non autorisé, même si l'appareil est compromis par un malware ou un vol physique. iOS fournit plusieurs mécanismes à cette fin.
Services de porte-clés
Contrairement aux fichiers par défaut ou simples, les entrées de la chaîne sont cryptées au repos avec une clé matérielle liée à l'appareil. Lors de l'enregistrement d'un jeton, utilisez le kSecClass (p. ex., kSecClassGénéricPassword[ pour des secrets opaques). Définissez le kSecAttrAccessiblekSecAttrAccessibleWhenPasscodeSetThisDeviceOnly pour s'assurer que les données ne peuvent être décryptées que lorsque l'appareil est déverrouillé et qu'un code passe est défini, et il ne peut pas être sauvegardé ou migré vers un autre périphérique.
Apple , documentation des services de porte-clés
App Sandbox et protection des données
Au-delà de la chaîne-clés, appliquer les API de protection des données iOS. Lors de la création de fichiers dans les répertoires Documents ou Caches, définir la classe de protection des fichiers à NSFileProtectionCompleteUnlessOpen ou, pour une plus grande sécurité, NSFileProtectionComplete (disponible uniquement lorsque l'appareil est déverrouillé).
Gestion des clés cryptographiques
Si votre système d'authentification utilise des signatures numériques, des clés éphémères ou un chiffrement symétrique, générer et stocker ces clés en utilisant l'Enclave Secure lorsque c'est possible. L'API SecKey vous permet de créer des clés elliptiques-courbes (p. ex. P-256) qui ne quittent jamais l'Enclave Secure. Cela les rend résistants à l'extraction même avec un compromis au niveau du noyau.
Utiliser l'authentification biométrique
Touch ID et Face ID offrent une combinaison de forte sécurité et d'excellente expérience utilisateur. En déchargeant l'entrée de mot de passe à une vérification biométrique, vous réduisez la surface d'attaque du phishing et du keylogging tout en réduisant la friction pour les utilisateurs de retour.
Intégration de l'authentification locale
Apple=2]LocalAuthentification framework fournit une interface standard pour évaluer les politiques biométriques.Lorsque vous présentez une demande biométrique, utilisez LAContext[ avec evaluePolitique:LAPolicyDeviceOwnerAuthentificationWithBiometrics[. Toujours fournir une chaîne de raison localisée qui décrit clairement pourquoi l'application a besoin d'authentification (p. ex., -S'identifier à votre compte). Pour les appareils modernes, préférez la cartographie robuste de profondeur de Face ID=1 – il est beaucoup plus difficile de spoof que Touch ID. Cependant, concevoir avec grâce votre retour : si la biométrie n'est pas inscrite ou échoue (p. ex., un utilisateur porte un masque de visage), invitez pour le code de passe de l'application ou le code de passe de l'appareil en utilisant LAPolicyDeviceOwnerAuthentification[.
Meilleures pratiques pour les jetons biométriques protégés
Ne pas stocker le modèle biométrique lui-même — il est géré par l'Enclave sécurisée et n'est jamais exposé à l'application. Au lieu de cela, stocker un jeton d'accès à l'intérieur de la chaîne-clés avec une liste de contrôle biométrique (ACL). Joindre un objet SecAccessControl[ avec kSecAccessControlBiométrieCurrentSet[ ou kSecAccessControlPresence. Cette configuration permet de récupérer le jeton uniquement après une analyse biométrique réussie.
Pomme de documentation d'authentification locale
Mettre en oeuvre une gestion adéquate des séances
Une fois qu'un utilisateur authentifie, maintenir cette session en toute sécurité est critique. Une manipulation inadéquate de la session peut conduire à des attaques de vol, de fixation de session ou de replay.
Sessions basées sur les jetons
Préférez les paires de jetons oAuth 2.0 au porteur : un jeton d'accès (de courte durée, généralement de 15 à 60 minutes) et un jeton de rafraîchissement (de longue durée, p.ex., 30 jours). Conservez les deux dans la chaîne de frappe avec un contrôle d'accès approprié. Ne jamais exposer les jetons d'accès dans les chaînes de requêtes URL; ne les transmettez qu'au moyen de l'en-tête Autorisation[ utilisant le schéma Bearer. Lorsque l'accès expire, l'application peut utiliser silencieusement le jeton de rafraîchissement pour obtenir un nouveau jeton sans interrompre l'utilisateur.
Révocation et déconnectation
Sur l'appareil, supprimez immédiatement les jetons de la chaîne-clés. Sur le serveur, maintenez une list license (ou une liste de révocation de jeton) de sorte que les services de backend rejettent tout jeton révoqué. Pour une sécurité maximale, utilisez jackon liging (p. ex., JWT="s ="cnf=" avec une clé publique) pour lier le jeton à un appareil ou une paire de clés spécifiques – ce qui empêche qu'un jeton volé soit utilisé ailleurs.
Délai de séance et inactivité
Mettre en place des timeouts de session inactif qui déconnectent automatiquement les utilisateurs après une période d'inactivité (p. ex., 15 minutes pour les applications financières). Considérez un timeout souple qui verrouille l'application localement mais conserve la session jusqu'à ce que l'utilisateur entre de nouveau un NIP court ou un balayage biométrique.
Stockage sécurisé des jetons
Nous avons déjà couvert le stockage Keychain, mais notons que les jetons de rafraîchissement ne devraient jamais être envoyés à des environnements non fiables. Si votre application utilise une vue web pour l'authentification, assurez-vous que JavaScript ne peut pas accéder aux jetons via document.cookie (régliez les HttpOnly et SameSite=Strict drapeaux sur les cookies utilisés par le serveur).
Assurer la communication sécurisée
Tout le trafic réseau entre l'application iOS et vos serveurs doit être chiffré en utilisant TLS 1.2 ou plus. Même si les données d'authentification ne sont jamais transmises, le trafic non chiffré expose les métadonnées (points de fin d'API, modèles de requête) qui peuvent aider les attaquants.
Sécurité des transports (ATS)
Apple applique ATS par défaut dans iOS 9 et plus tard, exigeant des connexions HTTPS qui répondent aux normes de sécurité modernes. Vous ne devriez jamais ajouter d'exceptions à NSAppTransportSecurity (sauf si cela est absolument nécessaire pour les services tiers existants, et seulement après une analyse minutieuse). Toujours définir NSAllowsArbitraryLoads[ à NO.Pour vos propres paramètres API, utilisez TLS 1.3 avec secret avant. Assurez-vous que votre serveur supporte une suite de chiffrement forte (p. ex. TLS AES 128 GCM SHA256) et désactive les chiffrements faibles.
Pinnage du certificat
Même avec HTTPS, une autorité de certification compromise (CA) pourrait émettre un certificat frauduleux pour votre domaine. Implémenter le pinnage de certificat en intégrant la clé publique du serveur (ou le hachage de certificat) dans votre binaire d'application.Utilisez la méthode NSURLSessionde délégation [URLESSession:didReceiveChallenge:complètementHandler:[ pour valider la clé épinglée contre le certificat du serveur. Ne pas piner sur le certificat de feuille lui-même (il doit être mis à jour annuellement) mais sur la clé publique de l'AC intermédiaire. Une autre approche consiste à utiliser la bibliothèque TrustKit[, mais soyez attentif aux mises à jour de l'application lorsque la clé de pinning change.
Transmission par jeton
Toujours envoyer des jetons sur la connexion HTTPS. N'incluez jamais les jetons dans la chaîne de chemin ou de requête (ils peuvent être enregistrés ou mis en cache par des mandataires intermédiaires). Utilisez l'en-tête Autorisation: Bearer <token>. Pour plus de sécurité, liez les jetons à la session TLS en incluant un hash du secret maître (la liaison de canal -=tls-unique=) dans la requête token – cela empêche les attaques de rejouer sur différentes connexions.
OWASP Mobile Top 10 – Communication sécurisée
Mises à jour et essais réguliers de sécurité
La sécurité n'est pas une tâche ponctuelle. Comme de nouvelles vulnérabilités apparaissent dans iOS, des bibliothèques tierces, et votre propre code, rester vigilant est essentiel.
Gestion de la dépendance
Vérifier chaque bibliothèque tierce que vous intégrez dans votre flux d'authentification. Utilisez des outils comme CocoaPods–Audit ou SPM="s validation intégrée pour détecter les vulnérabilités connues. Préférez des bibliothèques bien entretenues avec un enregistrement de suivi de sécurité, comme Alamofire (seulement si nécessaire; URL brutes est souvent plus sûre) ou Jose pour JSON Web Tokens. Évitez les dépendances qui exécutent le code natif ou le réseau d'accès directement sans examen de sécurité approprié.
Essais automatisés de sécurité
Intégrez le balayage de sécurité dans votre pipeline CI/CD. Utilisez des outils d'analyse statique (p. ex. SonarQube avec des règles Swift, ou SwiftLint avec des règles axées sur la sécurité) pour signaler les secrets codés en dur, l'entropie insuffisante ou l'utilisation incorrecte de crypto. Pour une analyse dynamique, appuyez sur Xcode=S Address Sanitizer et GuardMalloc[ pour attraper la corruption de mémoire.
Réponse aux divulgations de vulnérabilité
Avoir un processus pour gérer les rapports de bogues. Apple fournit l'outil de rétroaction de sécurité. Envisager de participer au programme Apple Security Bounty. Gardez toujours votre code d'authentification apps conforme au dernier SDK iOS – Apple déprécie souvent les API dangereuses (par exemple, UIWebView a été supprimé; utilisez ASWebAuthentificationSession plutôt).
Autres considérations en matière de sécurité
Un système d'authentification complet va au-delà du flux de connexion de base. S'adresser à ces zones complémentaires pour fermer les vecteurs d'attaque restants.
Récupération de compte et réinitialisation du mot de passe
Utiliser des jetons à usage unique et limité dans le temps envoyés aux adresses e-mail ou aux numéros de téléphone vérifiés. Évitez de révéler si un compte existe pendant le processus de récupération pour empêcher les attaques de dénombrement. Appliquer les mêmes règles de force de mot de passe que l'enregistrement initial.
Protections contre les limitations de taux et contre les forces de Brute
Implémenter le taux de limitation côté serveur sur les paramètres de connexion (p. ex., 5 tentatives par minute par IP ou utilisateur). Après plusieurs tentatives ratées, redemandez CAPTCHA ou un réessayer retardé. Sur iOS, vous pouvez également utiliser le cadre actéler pour calculer un défi de preuve de travail (bien que cela soit moins fréquent).
Protection des renseignements personnels et réduction des données
Ne pas demander des autorisations qui n'ont pas de relation directe (p. ex., contacts, emplacement) à moins que l'utilisateur ne opte explicitement pour l'authentification. Se conformer à AppleSign in with Apple Privacy Guidelines: when integressant cette fonctionnalité, utilisez l'adresse e-mail du relais privé pour empêcher le suivi. De plus, implémentez Session de navigateur Web éphémère[ (en utilisant ASWebAuthentiationSession[ avec prioriseEphemeralWebBrowserSession[ = YES[) pour éviter de fuite de cookies persistants de Safari dans le flux d'authentification.
Attestation du périphérique
Pour les applications à haute sécurité (p. ex., les services bancaires), envisager d'utiliser DeviceCheck[ ou App Attestation[ (via le DCAppAttestationService[) pour confirmer que la demande provient d'une copie authentique de votre application fonctionnant sur un appareil légitime. Ceci empêche les requêtes émulées de dispositifs enracinés ou jailbroken. Combinez l'attestation et le jeton d'authentification pour créer une affirmation de sécurité appuyée par le matériel.
Conclusion
En mettant en œuvre MFA avec PKCE, en stockant des secrets dans la chaîne-clés avec des contrôles d'accès biométriques, en gérant des durées de vie de jeton avec rotation, en appliquant des communications chiffrées avec des pinnings et des tests continus, vous pouvez réduire considérablement le risque de compromis. L'écosystème Apple fournit – de l'Enclave sécurisée à l'Authentification locale et à l'App Attribution – offre des primitives forts, mais ils doivent être appliqués correctement et tenus à jour. Investissez le temps de concevoir votre flux d'authentification avec ces meilleures pratiques dès le départ; la confiance de vos utilisateurs en dépend.
NIST Lignes directrices sur l'identité numérique (SP 800-63B)