Assurez l’intégrité des données
Lorsque vous protégez la sécurité des données, cela ne concerne pas uniquement leur confidentialité, mais aussi leur intégrité.
Le chiffrement permet de protéger la confidentialité des données. Cependant, il ne protège pas leur intégrité. Si vous envoyez un texte chiffré sur un canal non sécurisé, le texte chiffré pourra être intercepté et altéré par un attaquant avant d'atteindre son destinataire. Dans le cas du chiffrement par flux en particulier, chaque bit du texte chiffré correspond au bit du message en clair correspondant. En cas d'altération du texte chiffré, le destinataire ne peut pas vérifier que le message est bien celui que l'expéditeur a envoyé.
Pour contrôler l'intégrité des données, vous allez calculer une valeur de contrôle associée au message que vous transmettez en même temps que le message. Le contrôle d'intégrité peut concerner à la fois des données chiffrées et des données non chiffrées.
Le contrôle d'intégrité sans secret
Dans le chapitre précédent, vous avez étudié les fonctions de hachage sécurisées. Avec ces fonctions, on peut calculer une empreinte d'un message qui lui sera unique. Le moyen le plus simple pour faire un contrôle d'intégrité est donc de calculer le haché d'un message et de l'envoyer avec le message. Cependant, ça ne serait pas sécurisé. Dans le cas d'une attaque active, l'attaquant peut non seulement lire le message, mais aussi le modifier. Il peut donc aussi modifier le haché du message. Cela n'apporte donc pas d'assurance de l'intégrité du message.
On pourrait aussi hacher le message, puis chiffrer le message et le haché du message, avant de l'envoyer. Cette technique, appelée "Hash-then-Encrypt" n'est pas non plus sécurisée, notamment avec un chiffrement de flux. En effet, le chiffrement de flux est malléable, ce qui signifie qu'un attaquant qui connaît le message en clair peut modifier le texte chiffré, et contrôler la modification que cela aura sur le message en clair.
Par exemple, si vous téléchargez un fichier ISO contenant le système d'exploitation Linux sur un réseau non sécurisé (par exemple HTTP ou Torrent), vous ne pouvez pas garantir que le fichier n'ait pas été modifié par un attaquant pour insérer un malware. Vous pouvez vérifier le code d'intégrité de ce fichier, appelé checksum, sur le site Internet de l'éditeur de la distribution Linux, en HTTPS bien sûr ;). Le checksum est le haché du fichier avec une fonction de hachage cryptographique, par exemple SHA256.
Contrôlez l'intégrité des données avec un code MAC
Un code d'authentification de message ou MAC (Message Authentication Code) est une méthode de calcul d'une valeur de contrôle qui permet au destinataire d'un message de vérifier l'intégrité d'une donnée reçue. Le système MAC est composé de deux fonctions :
une fonction MAC() de création du code MAC, qui prend en entrée un message en clair m et une clé secrète k, et fournit en sortie le code MAC ;
une fonction V de vérification du code MAC qui prend en entrée le message, la clé secrète, le code MAC, et fournit en sortie la valeur VRAI si le code MAC est correct pour le message, et a la clé secrète.
L'expéditeur calcule le code MAC avec la fonction MAC() et le joint au message qu'il veut envoyer. Le destinataire reçoit le message et le code MAC associé. Il vérifie alors le code MAC avec la fonction de vérification V. Si la vérification est valide, le message n'a pas été modifié lors du transport.
En effet, le code MAC est envoyé en même temps que le message. Sans clé secrète, un attaquant pourrait modifier le message puis calculer le nouveau code MAC et transmettre ces deux valeurs modifiées au destinataire, qui ne se rendrait pas compte que le message a été modifié. Avec une clé secrète, comme l'attaquant ne connaît pas cette clé, il ne peut pas calculer le nouveau code MAC du message modifié ni transmettre au destinataire le message modifié accompagné du code MAC valide.
Un code MAC est transmis avec chaque message ; la quantité d'informations à envoyer ou à stocker est donc augmentée, ce qui nuit à la performance du système. Pour créer un code MAC sécurisé le plus court possible, vous pouvez utiliser 2 techniques, que je vous propose de voir dans la suite du chapitre.
Créez un code MAC avec le mode CBC (CBC-MAC)
Fonctionnement
Dans le mode de chiffrement par bloc CBC (Chain Block Cipher), que vous avez déjà vu précédemment, chaque bloc chiffré est lié au bloc chiffré précédent. Ainsi, une modification d'un seul bit dans le message entraîne une modification de tous les blocs chiffrés à partir de cette modification. Le système CBC-MAC consiste donc à chiffrer entièrement le message en mode CBC, et à ne conserver que le dernier bloc chiffré.
Avantages
En utilisant AES comme algorithme de chiffrement, le système CBC-MAC et ses variantes, comme CMAC, permettent donc d'obtenir un code MAC de taille fixe de 128 bits. AES étant la méthode de chiffrement la plus utilisée, on peut ainsi utiliser un seul algorithme pour chiffrer un message et calculer son code MAC.
Limites
En mode Raw-CBC-MAC (raw signifie brut), on utilise directement le dernier bloc CBC comme code MAC. Cela est sécurisé uniquement si la taille du message est fixée à l'avance, et donc connue du destinataire.
Si la taille du message n'est pas fixée, un attaquant pourrait faire une attaque de type extension de message, c'est-à-dire ajouter des caractères à la fin du message et calculer le code Raw-CBC-MAC valide pour le nouveau message, sans connaître la clé secrète.
Pour empêcher cela, il est possible de rajouter une dernière étape qui consiste à chiffrer le dernier bloc avec une deuxième clé secrète pour obtenir le code CBC-MAC du message. Cette dernière étape est souvent négligée, ce qui rend CBC-MAC dangereux dans la pratique.
Créez un code HMAC avec les fonctions de hachage
Fonctionnement
Un code HMAC (Hashed-MAC) est un code MAC créé avec une fonction de hachage et une clé secrète.
Intuitivement, vous pourriez créer un HMAC comme le haché de hash(k || m). Comme les fonctions de hachage cryptographiques sont résistantes aux préimages et aux collisions, il est impossible pour un attaquant de retrouver la valeur de la clé secrète k, ou de trouver un message m' différent de m qui ait le même haché que m. Cependant, cette construction serait vulnérable à une attaque de type extension de message. Connaissant m et hash(k || m), même sans connaître k, un attaquant pourrait calculer hash(k || m || m') et donc créer un HMAC valide pour m || m'.
Pour éviter cela, la fonction HMAC est définie de manière simplifiée comme ceci :
avec :
HMAC() la fonction de création d'un code HMAC ;
k la clé secrète ;
m le message dont on veut calculer le code MAC ;
hash() la fonction de hachage cryptographique (par exemple SHA-256).
Avantages
HMAC est aujourd'hui la méthode de code MAC la plus utilisée en raison de sa sécurité, de sa rapidité et de sa simplicité d'utilisation. En effet, elle ne nécessite l'utilisation que d'une clé secrète. Actuellement, la fonction SHA-256 (SHA-2 avec un bloc de 256 bits) est la plus utilisée pour créer un code HMAC ; on parle alors de la fonction HMAC-SHA256.
Avec la fonction de hachage SHA-3 (aussi appelée Keccak), il est également possible de générer un code MAC de manière plus simple en utilisant la construction KMAC.
Limites
Lorsque vous calculez un code MAC sans faire de chiffrement, vous utiliserez généralement HMAC. En revanche, lorsque vous voulez calculer le code MAC d'un texte chiffré, vous utiliserez de préférence une méthode de chiffrement qui inclut directement un code MAC.
Nous allons voir cela tout de suite.
Chiffrez et créez un code MAC en même temps avec le chiffrement authentifié
En général, le chiffrement et l'authentification des données sont nécessaires en même temps. La plupart des bibliothèques de cryptographie incluent donc d’une part des fonctions pour chiffrer un message et d’autre part des fonctions pour créer un code MAC pour le message. Cependant, lorsqu'elles sont utilisées en même temps, cela peut nuire à la sécurité de l'ensemble. Par exemple, le fait d'utiliser la même clé secrète pour le chiffrement et le code MAC peut diminuer la sécurité du chiffrement. Par ailleurs, certaines fonctions MAC ne garantissent pas la confidentialité du message, annulant là aussi la sécurité du chiffrement.
Face à ce constat, une nouvelle méthode de cryptographie se développe pour chiffrer et créer un code MAC simultanément. On appelle cela le chiffrement authentifié (en anglais Authenticated encryption, AE).
Les fonctions de chiffrement authentifié sont basées sur les fonctions de chiffrement et de création de MAC existantes, et garantissent la sécurité du chiffrement du contrôle d'intégrité.
Ces méthodes sont actuellement de plus en plus utilisées comme méthodes de chiffrement par défaut. Trois modes de chiffrement peuvent être notamment soulignés :
le mode de chiffrement CCM (Counter and CBC Mode) ; il permet de chiffrer un message en mode CTR et de créer un code CBC-MAC avec la même clé secrète, cela de manière sécurisée. Ainsi, la plupart des bibliothèques possèdent une fonction de chiffrement AES-CCM. Il existe également une variante de CCM appelée EAX ;
le mode de chiffrement GCM (Galois Counter Mode) ; il permet également de chiffrer un message en mode CTR et de créer un code MAC avec la même clé secrète. Avec GCM, le code MAC est directement intégré dans le texte chiffré. Le mode GCM est particulièrement rapide, car le chiffrement AES et le code MAC sont réalisé en une seule passe. C'est aujourd'hui le mode le plus utilisé pour le chiffrement authentifié ;
le chiffrement ChaCha20-Poly1305 ; c'est un nouveau mode de chiffrement authentifié très populaire. Il est basé sur une fonction de chiffrement de flux et ne dépend pas de AES. C'est la méthode la plus rapide lorsque AES n'est pas accéléré matériellement, par exemple sur certains smartphones.
Il est également possible de chiffrer une partie seulement d'un message, tout en calculant un code MAC pour l'ensemble du message. On parle alors de chiffrement authentifié avec données associées (en anglais Authenticated Encryption with Associated Data, AEAD). Vous pouvez ainsi associer des métadonnées publiques mais authentifiées, avec des données chiffrées et authentifiées. C'est utile par exemple pour authentifier l'en-tête d'un paquet réseau qui doit être transmis en clair, alors que le corps du paquet est chiffré.
En d'autres termes, cette technique s'adapte à tous les scénarios !
En résumé
Le contrôle d'intégrité permet de s'assurer qu'un message n'a pas été modifié par un attaquant ;
on utilise un code MAC avec une clé secrète partagée pour contrôler l'intégrité d'un message. Le type le plus courant est HMAC ;
le chiffrement authentifié désigne des protocoles qui font en même temps le chiffrement et le contrôle d'intégrité ;
ne pas confondre donnée/chiffrement authentifié avec l'authentification d'utilisateur !