Vous êtes sur la page 1sur 70

Langage de programmation

Swift
Partie I
Swift :
est un langage de programmation développé par Apple pour la création d'applications iOS, MacOs, Watch
OS et tv OS (aussi sur Linux Ubuntu). Il a été introduit en 2014 comme un remplacement plus moderne et
sûr pour Objective-C; le langage principal utilisé précédemment pour le développement d'applications sur la
plateforme Apple. Il est sous licence libre depuis 2015.
Swift propose un environnement de développement clair et sécurisé sans pour autant faire de compromis
sur la performance. Sa syntaxe s’accorde avec celle des autres langages de la famille C (C++, C#, Java,
JavaScript) tout en conservant le côté expressif que pouvait avoir Objective-C. On y retrouve la plupart des
notions de développement orienté objet ainsi que des fonctionnalités plus sophistiquées.

Swift est Multi-Paradigme


• programmation structurée, orientée objet et fonctionnelle
Swift est un langage très fortement typé
• toute variable est typée définitivement
• aucune conversion entre type n’est effectuée implicitement
Swift possède un mécanisme d’inférence de type
• permet de laisser le compilateur déterminer le type d’une variable allège l’écriture.

71
Swift : Caractéristiques
Swift est conçu pour être simple, expressif et sûr, tout en offrant des performances élevées. Voici quelques points
saillants qui caractérisent Swift :
1. Sécurité des types : Swift est un langage fortement typé, ce qui signifie que chaque variable et constante doit
avoir un type spécifique qui est vérifié par le compilateur. Cela contribue à prévenir les erreurs de type et à rendre
le code plus fiable.
2. Syntaxe concise et expressive : La syntaxe de Swift est conçue pour être concise et intuitive, ce qui facilite la
lecture et l'écriture du code. Il prend en charge des fonctionnalités telles que les fonctions imbriquées, les tuples et
les opérateurs surchargés, ce qui permet aux développeurs d'écrire un code plus élégant et expressif.
3. Gestion automatique de la mémoire : Swift utilise un modèle de gestion automatique de la mémoire (ARC -
Automatic Reference Counting) pour gérer la mémoire de manière efficace et éviter les fuites de mémoire. Cela
signifie que les développeurs n'ont généralement pas besoin de se soucier de l'allocation et de la libération de la
mémoire manuellement.
4. Interopérabilité avec Objective-C : Swift est compatible avec le code Objective-C existant, ce qui permet aux
développeurs de migrer progressivement leur code vers Swift tout en continuant à utiliser des bibliothèques et des
Frameworks Objective-C.
5. Évolution continue : Swift est un langage en évolution constante, avec des mises à jour régulières apportant de
nouvelles fonctionnalités, améliorations de performances et corrections de bugs.

72
Variables et Constantes
En Swift, vous pouvez déclarer des variables avec le mot-clé var et des constantes avec le
mot-clé let.

73
Variables et Constantes : Affectations
En Swift, vous pouvez déclarer des variables avec le mot-clé var et des constantes avec le
mot-clé let.

74
Variables et Constantes : Affectations

75
Types de données
Swift prend en charge différents types de données, tels que les entiers (Int), les nombres
à virgule flottante (Double, Float), les chaînes de caractères (String), les booléens
(Bool), etc.

76
Conversions de types : Opérations de conversions

77
Les commentaires

78
Entrées/Sorties en Swift : print () et readLine ()
Syntaxe de la fonction « print () »

79
Entrées/Sorties en Swift : print() et readLine()
La fonction readLine(): est utilisée pour lire une entrée de l'utilisateur depuis la console.
Elle retourne une chaîne de caractères, ce qui signifie qu'elle peut également retourner nil
si aucune entrée n'est saisie. Voici un exemple d'utilisation :

Dans cet exemple, la fonction readLine() est utilisée pour lire une entrée de l'utilisateur.
Si une valeur est saisie, elle est stockée dans la constante « name » et affichée avec un
message de salutation. Si aucune valeur n'est saisie, un message indiquant "Aucun nom
saisi." sera affiché.

80
Les Optionnels
Les variables et constantes telles que définies précédemment désignent nécessairement une
valeur ou un objet. Elle ne sont pas conçues pour désigner l’absence (i.e.: «pointeur» null
par exemple ou «pas de valeur» avec une quelconque convention…). Swift propose pour
cela les types optionnels (optionals).
Types optionnels (optionals): Type d'options, qui gère l'absence d'une valeur. Les
optionnels disent soit "il y a une valeur, et c'est égal à x" ou "il n'y a pas de valeur du tout".

Déclaration d'un Optionnel


Pour déclarer un optionnel, vous
utilisez le type optionnel
Optional<T>, ou plus
communément, la syntaxe
raccourcie T?, où T est le type de
la valeur possible.

81
Les Optionnels

82
Les Opérateurs
Swift prend en charge une variété d'opérateurs, y compris les opérateurs arithmétiques,
les opérateurs de comparaison, et les opérateurs logiques…

83
Strings basics

• Empty strings : • Interpolation des expressions :

• Concatenation :

84
Strings basics

• Ignorer la casse :

• Prefix and suffix :


Strings basics

• Recherche de sous-chaines :

• Vérification de la langueur

86
Types Alias

87
Tuples :
Les tuples regroupent plusieurs valeurs en une seule valeur composée. Les valeurs dans
un tuple peuvent être de tout type et ne doivent pas nécessairement être du même type.

• Les tuples sont créés en regroupant toute quantité de valeurs:

• Des valeurs individuelles peuvent également être nommées lors de la définition du tuple:

On peut utiliser un type de tuple comme


type de retour d'une fonction pour
permettre à la fonction de renvoyer un
seul tuple contenant plusieurs valeurs.

88
Exemple 1 :

Ecrire un programme en Swift pour gérer les informations d'un étudiant. Ces
informations sont optionnelles, ce qui signifie qu'elles peuvent être ‘nil’ si
aucune valeur n'est attribuée.
Le programme doit être capable de stocker le nom et l'âge de l'étudiant, puis
d'afficher ces informations.

89
Structures de contrôle
Swift prend en charge les structures de contrôle telles que les instructions
conditionnelles (if, else, switch)

IIF (Immediate If ou Inline If)

90
Structures de contrôle : For in , While, Repeat…While
La boucle for-in vous permet d'effectuer une itération sur n'importe quelle séquence.

• Vous pouvez parcourir à la fois les plages ouvertes et fermées:

• where Clause
En ajoutant une clause where, vous pouvez restreindre les itérations à celles qui satisfont
à la condition donnée.

91
Structures de contrôle : For in , While, Repeat…While
While boucle exécutera tant que la condition est vraie.

Boucle répétée Semblable à la boucle while, seule l'instruction de contrôle est évaluée après
la boucle. Par conséquent, la boucle sera toujours exécutée au moins une fois.

92
Exemple 2 :

Ecrire un programme en Swift qui permet de calculer la somme suivante : en


utilisant les boucles (for / repeat …while )

Exemple 3 :
Ecrivez un programme en Swift qui lit un entier strictement positif et affiche la
valeur de la plus grande puissance de 2 qui soit inférieure ou égale à ce nombre.
Exemples :
L’utilisateur a entré 10 —> Résultat : 3 car (23 = 8)
L’utilisateur a entré 73 —> Résultat : 6 car (26 = 64)

93
Les Collections: Tableaux
Les tableaux sont une collection ordonnée de valeurs. Les valeurs peuvent se répéter
mais doivent être du même type.

Syntaxe:
Les trois déclarations
suivantes sont équivalentes

• Array <Element>// Le type d'un tableau avec des éléments de type Element.
• [Element] () // Crée un nouveau tableau vide de type [Element].
Exemple :

94
Tableaux
• Tableaux avec valeurs répétées : Repeating
var myArray = [Int](repeating: 0, count: 100)

let arrayOfString = Array (repeating: ’’Example’’, count:3)

• Contains : If myArray.contains(5) {…}

• Ajout : myArray.append()

• Insertion : myArray.insert(1, at: 0)

var names = ["Ahmed","Karim","Charaf","Man"]


• Remove: let charaf =names.remove(at:2)
let man =names.removeLast()
names.removeAll()

95
Tableau multidimensionnel
Dans Swift, un tableau multidimensionnel est créé en imbriquant des tableaux:

un tableau à deux dimensions de Int est [[Int]] (ou Array<Array> ).

96
Les Collections: Dictionnaires
Les dictionnaires sont une collection non ordonnée de clés et de valeurs. Les valeurs
se rapportent à des clés uniques et doivent être du même type.

Lors de l'initialisation d'un dictionnaire, la syntaxe complète est la suivante:

Bien que ce soit un moyen plus concis d'initialiser:

Déclarez un dictionnaire avec des clés et des valeurs en les spécifiant dans une liste
séparée par des virgules. Les types peuvent être déduits des types de clés et de valeurs.
Les Collections: Dictionnaires
var personne = ["Nom": "Alami", "Prénom": "Ahmed", "Adresse" : "n 5 rue Izmir ",
"Ville": "Rabat"]

• Parcourir un dictionnaire :
Fonctions
En Swift, vous pouvez définir des fonctions à l'aide du mot-clé « func ».
• Les fonctions peuvent être déclarées sans paramètre ni valeur de retour. La seule
information requise est un nom.
• Les fonctions peuvent prendre des paramètres pour que leurs fonctionnalités puissent
être modifiées. Les paramètres sont donnés sous forme de liste séparée par des virgules,
leurs types et noms étant définis.
• Les fonctions peuvent renvoyer des valeurs en spécifiant le type après la liste des
paramètres.
• Les fonctions peuvent également renvoyer plusieurs valeurs à l'aide de tuples.

99
Example 1 :

Écrivez une fonction qui retourne le max, min


et total d’un tableau.

Example 2 :

Ecrire une fonction qui prend un tableau de caractères en


entrée et retourne un nouveau tableau contenant uniquement
les caractères uniques du tableau original. Un caractère est
considéré comme unique s'il n'apparaît pas plus d'une fois
dans le tableau original.

100
Example 3 :

Écrivez une fonction en Swift qui demande à l'utilisateur d'entrer deux

nombres entiers, puis retourne un message indiquant si la multiplication de

ces deux nombres donne un résultat positif, négatif ou nul.

101
Programmation Orientée Objet
Swift
Partie II
Les Classes
En Swift, une classe est un type de données qui permet de définir un ensemble de
propriétés et de méthodes associées. Une classe est utilisée pour créer des objets, qui
sont des instances de cette classe.

Définition d'une classe

Pour définir une classe en Swift, utilisez le mot-clé « class » suivi du nom de la classe.

Dans le corps de la classe, vous pouvez déclarer des propriétés pour stocker des données
et des méthodes pour effectuer des opérations sur ces données. Voici un exemple simple
de définition de classe :

103
Les Classes : init ()
L’initialisateur init() est une méthode spéciale utilisée pour initialiser une nouvelle
instance d'une classe. Il a le même nom que la classe et peut prendre des paramètres
pour initialiser les propriétés de l'objet.

En Swift, il existe différents types d'initialisateurs (init()) que vous pouvez définir dans une
classe pour initialiser ses instances. Voici les principaux types d'initialisateurs :

1. Initialisateur par défaut :


2. Initialisateur avec des paramètres :
3. Initialisateur de délégué :
4. Initialisateur optionnel :

104
Les Classes : init ()
1. Initialisateur par défaut :
C'est un initialisateur sans paramètres qui initialise les propriétés de la classe avec des
valeurs par défaut. Si vous ne fournissez pas d'initialisateur personnalisé dans votre classe,
Swift fournit automatiquement un initialisateur par défaut.

2. Initialisateur avec des paramètres :


C'est un initialisateur qui prend un ou plusieurs paramètres pour initialiser les propriétés de
la classe avec des valeurs fournies par l'utilisateur.

en Swift, « self » est l'équivalent de « this »


dans d'autres langages de programmation
orientée objet comme Java, C++, ou
JavaScript.

105
Les Classes : init ()

3. Initialisateur de délégué :
C'est un initialisateur qui délègue l'initialisation à un
autre initialisateur dans la même classe.

4. Initialisateur optionnel :
C'est un initialisateur qui peut créer une instance
de la classe avec une valeur nil. Il est utilisé
principalement pour les propriétés optionnelles.

106
Les Classes : Objet
En Swift, vous pouvez déclarer un objet en instanciant une classe à l'aide de l'initialisateur approprié.
Si la classe fournit un initialisateur par défaut (c'est-à-dire un initialisateur sans paramètres), vous
pouvez simplement utiliser le nom de la classe suivi de parenthèses vides pour créer un nouvel objet.

Syntaxe :

Exemple :

107
Les Classes : Propriétés
Les classes peuvent définir des propriétés que les instances de la classe peuvent utiliser.
les propriétés peuvent être classées en plusieurs catégories, notamment les propriétés
stockées, les propriétés calculées et les propriétés de type.
• Propriétés Stockées
Les propriétés stockées sont des propriétés qui stockent et conservent une valeur attribuée.
Les propriétés stockées peuvent être des variables (mutables) ou des constantes
(immuables). Elles sont déclarées à l'intérieur d'une classe.
• Propriétés Calculées
Les propriétés calculées sont des propriétés dont la valeur est calculée à partir d'une
logique ou d'un calcul spécifié dans leur définition. Elles ne stockent pas de valeur elles-
mêmes, mais fournissent plutôt un moyen de calculer et de retourner une valeur à chaque
fois qu'elles sont accédées. Les propriétés calculées sont déclarées à l'aide de get et
éventuellement set pour fournir un getter et un éventuel setter.
• Propriétés de Type
Les propriétés de type sont des propriétés qui appartiennent à tout le type lui-même,
plutôt qu'à une instance spécifique de ce type. Elles sont déclarées à l'intérieur d'une
classe, d'une structure ou d'un énuméré avec le mot-clé static. Les propriétés de type
peuvent être des propriétés stockées ou calculées.

108
Les Classes : Propriétés
Exemples :

II

109
Exemple :

1.Créez une classe Swift appelée Compte qui représente un compte bancaire,
ayant un attribut solde de type Double.
2.Créez un initialisateur initialisant le solde.
3.Créez une méthode deposer() pour gérer les dépôts.
4.Créez une méthode retirer() pour gérer les retraits.
5.Créez une méthode afficher() pour afficher le solde.
6.Donnez le code complet de la classe Compte.
7.Créez une classe TestCompte pour tester le compte en effectuant un dépôt
puis un retrait.

110
Exemple :

1.Créez une classe Swift appelée Rectangle ayant pour attributs longueur et
largeur, tous deux de type Double. Ajoutez ensuite un constructeur avec des
paramètres.
2.Définissez une méthode surface() renvoyant un Double pour calculer la surface
du rectangle et une méthode perimetre() renvoyant un Double pour calculer le
périmètre du rectangle.
3.Créez une méthode afficher() pour afficher les résultats. Donnez ensuite le code
complet de la classe.
4.Créez une classe TestRectangle pour afficher les résultats de la surface et du
périmètre

111
Les Classes : Héritage
En Swift, l'héritage est établi entre deux types de classes : la classe de base (ou super-classe)
et la sous-classe (ou classe dérivée). La classe de base est la classe dont une autre classe
hérite, tandis que la sous-classe est la classe qui hérite des propriétés et des méthodes de la
classe de base. L'héritage est un pilier fondamental de la programmation orientée objet, car il
permet la réutilisation du code et la création d'une hiérarchie de classes.

Syntaxe :

• Surcharge (Méthode Override)

La surcharge est le processus par lequel une sous-classe fournit une implémentation
spécifique pour une méthode déjà implémentée dans sa super-classe. En Swift, pour
surcharger une méthode, vous utilisez le mot-clé « override ». Par exemple, dans la classe
Voiture, la méthode demarrer() est surchargée pour personnaliser son comportement :

112
Les Classes : Héritage
• Accès aux Propriétés et Méthodes de la Super-classe
Une sous-classe peut accéder aux propriétés et méthodes de sa super-classe à l'aide du
mot-clé super. Par exemple, dans la classe Voiture, le constructeur appelle le constructeur
de sa super-classe à l'aide de super.init() :

113
Les Structures
En Swift, vous pouvez déclarer une structure à l'aide du mot-clé struct, suivi du nom de
la structure et des propriétés qu'elle contient.

Accès aux Propriétés


Vous pouvez accéder aux propriétés d'une structure à l'aide de la notation pointée (.).

Mutabilité des Structures


Par défaut, les instances de structures sont immuables, ce qui signifie que leurs propriétés
ne peuvent pas être modifiées après leur création. Pour permettre la modification des
propriétés, vous devez marquer l'instance comme var, ce qui la rend mutable.

114
Les Structures

Comparaison des Structures et des Classes


Les structures sont similaires aux classes en Swift, mais avec quelques différences clés :

Ø Les structures sont des types de valeurs, ce qui signifie qu'elles sont copiées
lorsqu'elles sont passées en tant qu'arguments de fonction ou lorsqu'elles sont
affectées à d'autres variables.
Ø Les structures ne prennent pas en charge l'héritage.
Ø Les structures ont un initialisateur de membre par défaut fourni par Swift, alors que
les classes n'en ont pas.

115
Les énumérations : Enum
Les énumérations (enums) en Swift sont un moyen de définir un groupe de valeurs liées
dans un seul type de données. Elles sont largement utilisées pour représenter un ensemble
fini de valeurs associées à un concept spécifique.

En Swift, vous pouvez déclarer une énumération à l'aide du mot-clé enum, suivi du nom
de l'énumération et des cas possibles.

Ou

Les valeurs Enum peuvent être utilisées par leur nom complet, mais vous pouvez
omettre le nom du type lorsqu'il peut être déduit:

116
Les énumérations : Enum
La méthode la plus fondamentale pour comparer / extraire des valeurs enum consiste à
utiliser une instruction switch :

Énumérations avec des Types de Données


Les énumérations en Swift peuvent avoir des types de données associés à leurs cas.

117
Les énumérations : Enum
Les valeurs associées dans les énumérations:
permettent à chaque cas de l'énumération de transporter des données supplémentaires qui lui
sont associées. Cela signifie que chaque cas peut contenir des informations spécifiques en
plus de son propre nom.

Lorsque vous utilisez cette énumération pour représenter le résultat d'une requête réseau,
vous pouvez également fournir des informations détaillées sur le succès ou l'échec de la
requête.

De même, vous pouvez utiliser le cas echec pour représenter le cas où la requête échoue et
fournir des détails sur l'erreur :

118
Les droits d’ accès :
En Swift, vous pouvez définir les droits d'accès (ou niveaux de visibilité) pour les propriétés, les méthodes, les
initialisateurs et les types en utilisant les mots-clés public, internal, fileprivate et private. Voici ce que chaque
mot-clé signifie :
1. public :
1. Les membres marqués public sont accessibles à partir de n'importe où, à l'intérieur du module dans
lequel ils sont définis, ainsi que de n'importe quel autre module qui importe le module dans lequel ils
sont définis.
2. Ils sont utilisés lorsque vous voulez que votre code soit accessible depuis d'autres modules externes.
2. internal :
1. Les membres marqués internal sont accessibles uniquement à partir de l'intérieur du module dans
lequel ils sont définis.
2. C'est le niveau de visibilité par défaut si aucun niveau de visibilité n'est spécifié.
3. Ils sont utilisés lorsque vous voulez que votre code soit accessible uniquement à l'intérieur de votre
propre module.
3. fileprivate :
1. Les membres marqués fileprivate sont accessibles à partir de n'importe où à l'intérieur du même
fichier source dans lequel ils sont définis.
2. Ils ne sont pas accessibles à partir d'autres fichiers source du même module.
3. Ils sont utilisés lorsque vous voulez limiter l'accès à une partie spécifique d'un fichier source.
4. private :
1. Les membres marqués private sont accessibles uniquement à partir de l'intérieur du même type ou
de la même extension dans lequel ils sont définis.
2. Ils ne sont pas accessibles à partir d'autres types, même s'ils sont définis dans le même fichier
source.
3. Ils sont utilisés lorsque vous voulez limiter l'accès à une partie
spécifique d'un type.
119
Les Protocoles:
Un protocole en Swift définit un ensemble de méthodes et de propriétés que les types
peuvent adopter. Il agit comme un contrat ou une interface, définissant un ensemble de
fonctionnalités que les types doivent implémenter s'ils adoptent ce protocole. Les
protocoles permettent d'établir des normes de comportement pour les types et de faciliter
le polymorphisme et la généricité dans le code.

Déclaration d'un Protocole


Un protocole est déclaré à l'aide du mot-clé « protocol », suivi du nom du protocole et de
ses exigences, comme les méthodes et les propriétés.

120
Les Protocoles:
Adoption de Protocole
Un type adopte un protocole en le mentionnant après son nom de type, suivi par un deux-
points.

Utilisation de Protocoles
Les protocoles peuvent être utilisés pour créer des variables, des fonctions ou des méthodes
qui acceptent n'importe quel type qui adopte ce protocole.

121
Exercice 1 :
1.Définissez une classe ContactManager avec les propriétés suivantes :
contacts: un dictionnaire avec le nom du contact comme clé et son numéro de téléphone comme
valeur.
2.Assurez-vous que la classe a une initialisation appropriée.
3.Ajoutez une méthode addContact à la classe ContactManager qui prend le nom et le numéro de
téléphone d'un contact en paramètres et l'ajoute au dictionnaire de contacts.
4.Ajoutez une méthode removeContact qui prend le nom d'un contact en paramètre et le supprime du
dictionnaire de contacts.
5.Ajoutez une méthode updateContact qui prend le nom d'un contact et son nouveau numéro de
téléphone en paramètres, et met à jour le numéro de téléphone du contact correspondant dans le
dictionnaire.
6.Ajoutez une méthode showContacts qui affiche la liste de tous les contacts avec leurs numéros de
téléphone.
7.Testez votre classe en créant une instance de ContactManager, en ajoutant quelques contacts, en
supprimant certains contacts, en mettant à jour le numéro de téléphone de certains contacts et en affichant
la liste mise à jour des contacts

122
Sécurité des applications
iOS
Introduction :

iOS protège non seulement les données stockées dans l'appareil iOS, mais également
les données transmises sur les réseaux lors de l'utilisation des services Internet. iOS
offre une sécurité avancée et sophistiquée pour les appareils iOS et est également très
facile à utiliser. Les utilisateurs n'ont pas besoin de passer beaucoup de temps sur les
configurations de sécurité, car la plupart des fonctionnalités de sécurité sont
automatiquement configurées par iOS.
iOS prend également en charge l'authentification biométrique (Touch ID), récemment
incorporée aux appareils iOS, permettant aux utilisateurs d'utiliser facilement leurs
empreintes digitales pour effectuer des tâches privées et sensibles telles que le
déverrouillage de l'iPhone et les paiements.

124
Le modèle de sécurité iOS
Le modèle de sécurité d'iOS est plus restrictif par rapport à Android. iOS est
un système fermé, où les développeurs peuvent créer leurs propres applications
mais son code source n'est pas publié, contrairement à Android [20].
1. La sécurité au niveau du système : (System Level Security) implémente
un processus de chaîne de démarrage sécurisé (Secure boot chain), une
enclave sécurisée (Secure Enclave), Touch ID et autorise les mises à jour
logicielles système.
2. La sécurité au niveau de l'appareil : (Device Level Security) comprend
des mécanismes de verrouillage au niveau de l'appareil tels que le
passcode ou PIN et remote wipe a l’aide Mobile Device
Management (MDM).
3. La sécurité au niveau des données : (Data Level Security) englobe une
méthodologie de chiffrement des fichiers via des classes de protection
des données et l'utilisation de composants matériels et logiciels.
Le chiffrement des données dans iOS n'est pas configurable ; par conséquent, il
ne peut être désactivé par les utilisateurs. La figure illustre le modèle de
sécurité d'iOS.

125
1. System Level Security
est au cœur de la sécurité dans iOS. Elle garantit que le matériel et le logiciel sont intégrés de manière sécurisée
les uns aux autres, de sorte que chaque composant dans iOS soit sécurisé et digne de confiance.

1. Processus de démarrage sécurisé (Secure Boot Chain): Lors du processus de démarrage, iOS utilise un
mécanisme appelé "chaîne de démarrage sécurisé" pour garantir que le logiciel de bas niveau n'est pas compromis et qu'iOS
s'exécute sur un appareil iOS validé. Chaque étape de la chaîne de démarrage sécurisé vérifie si l'étape suivante de la chaîne est
valide et signée par Apple. Le processus de démarrage ne passera à l'étape suivante de la chaîne que si la vérification réussit.

Lorsque vous allumez un appareil iOS, le processeur exécute


d'abord le code à partir de Boot ROM (mémoire morte en lecture
seule). Le code dans Boot ROM est créé lors de la fabrication de la
puce, il est donc fiable et immuable. Le code dans Boot ROM
contient également la clé publique Apple Root CA, qui sera
utilisée pour vérifier si Low-Level Bootloader (LLB) est signé par
Apple. Si LLB est valide, le processeur exécutera le chargeur
d'amorçage de prochaine étape, iBoot, qui vérifiera à son tour et
exécutera le noyau iOS.

126
1. System Level Security (Suite)
1. Boot ROM (Mémoire morte de démarrage) :
1. C'est le premier code significatif qui s'exécute lorsqu'un appareil iOS est allumé.
2. Il est gravé dans le matériel et est inviolable.
3. La Boot ROM initialise le système et charge le chargeur de démarrage principal (LLB)
après avoir vérifié sa signature pour s'assurer qu'il provient d'Apple et n'a pas été altéré.
2. Low-Level Bootloader (LLB) :
1. Le LLB est chargé par la Boot ROM et est responsable du chargement du firmware de
l'iBoot suivant après également vérification de sa signature.
2. Il sert également de pont entre la Boot ROM et les étapes de démarrage plus élevées.
3. iBoot :
1. iBoot est le chargeur de démarrage de second niveau.
2. Il vérifie et exécute le kernel (noyau) d'iOS après avoir vérifié sa signature cryptographique.
3. iBoot est également responsable de la vérification de la partition du système d'exploitation
et peut placer l'appareil en mode de récupération en cas de corruption de données ou
d'erreur de vérification.
4. Kernel :
1. Le noyau d'iOS est chargé après iBoot. Il initialise les pilotes de périphériques et la gestion
de la mémoire.
2. Le kernel lance ensuite le système d'exploitation en exécutant le reste des composants
système.

127
1. System Level Security (Suite)
2. Enclave sécurisé (Secure Enclave) : L'Enclave sécurisée est un coprocesseur pour le processeur (Séries-A)
d'Apple. Il possède son propre démarrage sécurisé séparé du processeur d'application, la communication entre celui-ci et le
processeur d'application est fortement encapsulée. Ses tâches comprennent la gestion des clés, le traitement des opérations
cryptographiques et le maintien de l'intégrité des données.
Chaque Enclave sécurisée est dotée d'un identifiant unique (UID) lors de la fabrication. D'autres parties du système n'ont pas
accès à l'UID, pas plus qu'Apple. L'UID est utilisé pour crypter l'espace mémoire de l'Enclave sécurisée et les données des
fichiers stockés dans le système de fichiers.
L'Enclave sécurisée est également responsable du déchiffrement et du traitement des empreintes digitales reçues depuis le Touch
ID/Face ID, vérifiant si les empreintes digitales reçues correspondent aux empreintes digitales enregistrées. Le processeur
d'application transmet les données d'empreintes digitales à l'Enclave sécurisée. Comme les données d'empreintes digitales sont
cryptées avec une clé de session entre l'Enclave sécurisée et le Touch ID, le processeur d'application ne peut pas les lire.

128
1. System Level Security (Suite)
3. Sécurité du Touch ID : Le Touch ID est un capteur d'empreintes digitales qui peut lire les
empreintes digitales de l'utilisateur. Un utilisateur qui passe la vérification des empreintes
digitales peut accéder de manière sécurisée à l'appareil, tel que déverrouiller l'appareil iOS,
effectuer des achats depuis l'App Store et effectuer des paiements sécurisés via Apple Pay (plus
d'informations dans la section Apple Pay).
Lorsque l'utilisateur touche le bouton d'accueil, la bague en acier capacitive sur le bouton
d'accueil détecte le doigt et active le capteur Touch ID. Ensuite, le Touch ID scanne les
empreintes digitales et envoie 88-by-88-pixel, 500-ppi raster à l'Enclave sécurisée pour
authentification. Le scan est vectorisé pour analyse et temporairement stocké dans la mémoire
cryptée de l'Enclave sécurisée. Après l'authentification, il est supprimé.

129
2. Device Level Security
Le Passcode est un élément important de la sécurité sur iOS. En configurant un passcode, la
Protection des données est automatiquement activée par iOS. La plupart des gens pensent que le
passcode est simplement un code à 4 chiffres pour déverrouiller les appareils iOS. Néanmoins, il
peut être défini comme un code alphanumérique de longueur arbitraire. Plus important encore, il
est également utilisé pour générer des clés de chiffrement. Ainsi, plus votre passcode est fort,
plus les clés de chiffrement générées sont robustes.

Remote wipe, en français "effacement à distance", est une fonctionnalité de sécurité qui permet
à un utilisateur ou à un administrateur de supprimer toutes les données stockées sur un appareil
à distance, généralement par le biais d'une connexion Internet. Cette fonctionnalité est souvent
utilisée dans le contexte de la gestion des appareils mobiles (MDM) ou des services de sécurité
pour protéger les données en cas de perte, de vol ou de compromission de l'appareil.
Lorsqu'un "remote wipe" est déclenché, toutes les données stockées sur l'appareil, y compris les
applications, les photos, les vidéos, les fichiers, les paramètres, etc., sont supprimées de manière
irréversible.

130
3. Data Level Security
En plus de s'assurer que seul le code et les applications de confiance peuvent s'exécuter sur les
appareils, iOS chiffre également et protège les données de l'utilisateur localement et à distance.

Hardware Data Security : Les opérations cryptographiques étant complexes et consommatrices de CPU,
elles pourraient entraîner des problèmes de durée de vie de la batterie si elles ne sont pas bien implémentées.
Chaque appareil iOS dispose d'un moteur de chiffrement (Crypto Engine) AES-256 dédié intégré dans le chemin
d'accès à la mémoire principale entre le stockage flash et la mémoire système principale, ce qui rend le processus
de chiffrement très efficace.
Chaque appareil possède également un UID (Identifiant Unique) et un GID (Identifiant de Groupe de Dispositifs),
qui sont des clés de 256 bits. Ils sont créés et stockés dans le processeur d'application lors de la fabrication, aucun
logiciel ou matériel ne pouvant y accéder directement. L'UID est unique à chaque appareil, tandis que les
appareils dotés de processeurs communs ont le même GID. Les données chiffrées à l'aide de l'UID sont liées à un
appareil particulier, donc si la puce mémoire est physiquement déplacée vers un autre appareil, les fichiers
chiffrés ne seront pas accessibles.

131
3. Data Level Security (Suite)
En plus de s'assurer que seul le code et les applications de confiance peuvent s'exécuter sur les appareils, iOS chiffre également et
protège les données de l'utilisateur localement et à distance.

File Data Protection : Dans iOS, la protection des données de fichiers est assurée par la construction et la gestion d'une
hiérarchie de clés en conjonction avec le moteur de chiffrement matériel (Crypto Engine) . La figure illustre cette hiérarchie et les
relations entre les clés. Lorsqu'un fichier est créé, le système de Protection des Données crée une clé de 256 bits (clé "par fichier") et
la transmet au moteur AES matériel, qui utilisera la clé par fichier pour chiffrer le fichier.

Dans iOS, chaque fichier est protégé par une clé spécifique. Cette clé est enveloppée avec d'autres clés spéciales, appelées clés de classe
(Class Key), pour une sécurité supplémentaire. Le processus de protection de la clé est réalisé en utilisant une technique appelée
enveloppement de clé AES, une méthode de chiffrement standardisée par le NIST.
Une fois enveloppée, cette clé spécifique pour le fichier est stockée dans les métadonnées du fichier lui-même. Lorsqu'un utilisateur
souhaite ouvrir un fichier, iOS commence par décrypter les métadonnées du fichier en utilisant une clé spéciale appelée clé du système
de fichiers (File System Key). Cette clé contient la clé enveloppée pour le fichier ainsi que les informations nécessaires pour la
déchiffrer.
Une fois que les métadonnées sont déchiffrées, iOS utilise les « Class Key » correspondantes pour déballer la clé spécifique du fichier.
Cette clé spécifique est ensuite transmise au moteur de chiffrement matériel AES, qui déchiffre les données du fichier stockées dans la
mémoire flash. 132
3. Data Level Security (Suite)
Data Protection Class : Sur iOS, il existe plusieurs classes de protection des données, qui définissent les
politiques de sécurité pour les données stockées. Voici quelques-unes de ces classes :

1. Protection Complète (Complete Protection) : Les données sont chiffrées à l'aide d'une clé dérivée d'une
combinaison du mot de passe de l'utilisateur et de la clé matérielle de l'appareil. Les données sont accessibles
uniquement lorsque l'appareil est déverrouillé.
2. Protégé Sauf Ouverture (Protected Unless Open) : Les données sont chiffrées dès qu'elles sont écrites sur
le disque, mais elles peuvent être accédées tant que l'application qui les a créées est en cours d'exécution.
3. Protégé Jusqu'à la Première Authentification de l'Utilisateur (Protected Until First User
Authentication) : Les données sont chiffrées dès qu'elles sont écrites sur le disque, mais elles ne sont
accessibles qu'après que l'utilisateur se soit authentifié pour la première fois après le démarrage de l'appareil.
4. Aucune Protection (No Protection) : Les données ne sont pas chiffrées. Cette classe est souvent utilisée
pour les données qui ne sont pas sensibles.

133
3. Data Level Security (Suite)
Le Keychain iOS est une fonctionnalité de sécurité qui permet aux développeurs de stocker de manière
sécurisée des informations sensibles telles que des mots de passe, des clés d'authentification, des jetons d'API,
des certificats, etc., sur les appareils iOS. Son rôle principal est de fournir un stockage sécurisé et crypté pour
ces données sensibles, tout en garantissant qu'elles ne peuvent être accédées que par les applications autorisées.

En résumé, les passcodes, class keys et file keys, ils sont stockés dans le Keychain, qui est une base de données
sécurisée intégrée au système d'exploitation iOS.

134
Problèmes de sécurité avec iOS
Étant donné qu'iOS est un système d'exploitation mobile très avancé et sécurisé, et qu'Apple dispose d'une
procédure stricte de révision des applications, il est presque impossible que des applications semblant malveillantes
soient publiées sur l'App Store et exécutent des tâches malveillantes sur les appareils iOS. Cependant, il existe
toujours quelques menaces et failles dans la sécurité d'iOS.

1. Benign apps could become evil


Une équipe de recherche affirme qu'elle a réussi à publier son application malveillante (appelée application Jekyll) sur
l'App Store en cachant les comportements malveillants de l'application pendant le processus de révision de
l'application.
Comme ils l'ont décrit dans leur article, pour contourner la procédure stricte de révision des applications et de signature
de code d'Apple, les attaquants malveillants cachent des comportements malveillants dans l'application de manière à ce
qu'elle paraisse légitime et bénigne pendant le processus de révision. Après que l'utilisateur a téléchargé et exécuté
l'application, l'attaquant peut activer à distance les fonctionnalités malveillantes (c'est-à-dire Backdoor) dans
l'application. Plus précisément, comme présenté dans l’article, l'application Jekyll peut publier des tweets, envoyer des
e-mails et des SMS sans que l'utilisateur en soit conscient.

135
Problèmes de sécurité avec iOS
2. Masque Attack
Une équipe de recherche en sécurité mobile appelée FireEye prétend récemment que des attaquants peuvent tromper les utilisateurs pour
qu'ils installent des applications iOS malveillantes se faisant passer pour d'autres applications couramment utilisées, telles que
l'application Gmail ou même votre application bancaire. Tant que les deux applications utilisent le même identifiant de bundle,
l'application authentique peut être remplacée par l'application malveillante de manière à ce que le processus ressemble exactement au
processus de mise à jour d'une application existante, comme le montre la figure. Ce type de mascarade augmente les chances de tromper
les utilisateurs négligents. [FireEye 08]
Cette attaque de type Masque pourrait avoir des conséquences graves. Si l'application malveillante remplace votre application Gmail ou
bancaire, une fois que vous exécutez l'application, un code malveillant sera exécuté et enverra vos informations d'identification de
connexion à l'attaquant. De plus, le code malveillant peut accéder aux fichiers locaux de l'application remplacée, ce qui entraîne le vol
de données plus privées

136
Problèmes de sécurité avec iOS
3. iOS jailbreaking
Le jailbreaking iOS est le processus de suppression des limitations sur iOS, le système d'exploitation d'Apple sur les appareils le
faisant fonctionner grâce à l'utilisation de logiciels et d'exploits matériels. La raison pour laquelle de nombreuses personnes
veulent jailbreaker leurs appareils iOS est parce que cela donne aux utilisateurs un accès root à iOS, leur permettant d'avoir plus
de privilèges pour personnaliser leurs appareils iOS. Ces privilèges incluent l'installation d'applications ou d'extensions qui ne
sont pas fournies par l'App Store d'Apple, et la personnalisation de l'interface utilisateur d'iOS.
Le plus gros problème du jailbreaking est qu'il expose les utilisateurs à d'énormes risques de sécurité puisqu'il désactive la
fonctionnalité de Sandbox d'iOS. Sandbox est une fonctionnalité de sécurité importante d'iOS pendant le processus d'exécution,
il sépare les applications installées sur l'appareil de telle sorte que les applications sont restreintes d'accéder aux fichiers associés
à d'autres fichiers pendant l'exécution. Si un utilisateur installe une application malveillante sur l'appareil iOS jailbreaké, le code
malveillant aura accès au contact, aux photos, aux données de localisation et à d'autres données privées sans en informer
l'utilisateur. Outre les risques de sécurité liés au jailbreaking, une fois qu'un utilisateur jailbreake ses appareils iOS, la garantie
(AppleCare) fournie par Apple sera immédiatement annulée. Pendant ce temps, étant donné qu'Apple n'a cessé d'incorporer de
nouvelles fonctionnalités dans la dernière version d'iOS, les avantages du jailbreaking deviennent de moins en moins évidents.

137
Problèmes de sécurité avec iOS
4. Pegasus Attack
L'attaque Pegasus est une forme sophistiquée de logiciel espion développée par la société NSO Group, qui cible spécifiquement les
appareils iOS tels que les iPhones et les iPads. Cette attaque a été largement utilisée par des acteurs malveillants, y compris des agences
gouvernementales, pour surveiller et espionner les utilisateurs ciblés à des fins de renseignement ou de surveillance.
Voici comment fonctionne l'attaque Pegasus :
1. Infection initiale : L'attaque commence généralement par l'envoi d'un message de phishing ou d'un lien malveillant à la victime,
souvent par e-mail ou par message texte. Ce message peut sembler légitime et inciter la victime à cliquer dessus.
2. Exploitation de vulnérabilité : Une fois que la victime clique sur le lien ou ouvre le message, l'attaque exploite une vulnérabilité zero-
day dans iOS pour exécuter du code malveillant sur l'appareil de la victime, contournant ainsi les mesures de sécurité intégrées.
3. Installation du logiciel espion : Une fois que l'attaque a réussi à compromettre l'appareil, elle installe silencieusement le logiciel espion
Pegasus. Ce logiciel espion est capable de collecter une vaste gamme de données sur l'appareil, y compris les messages, les appels, les
e-mails, les photos, la localisation GPS et bien plus encore.
4. Surveillance à distance : Une fois installé, le logiciel espion Pegasus peut être contrôlé à distance par les attaquants. Cela leur permet
de surveiller activement les activités de la victime, d'accéder à ses données sensibles et même d'activer les fonctionnalités de l'appareil
telles que le microphone et la caméra pour écouter et voir ce qui se passe autour de la victime.

L'attaque Pegasus est extrêmement dangereuse car elle peut être déployée de manière invisible et sans interaction de l'utilisateur, et elle
peut contourner les mesures de sécurité intégrées aux appareils iOS. De plus, elle cible spécifiquement des individus ou des groupes
spécifiques, ce qui en fait un outil puissant pour la surveillance et la collecte de renseignements.

138
Chronologie : iOS Malware

139

Vous aimerez peut-être aussi