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)