Tour d'horizon du chiffrement sur le web

le 19/08/2022 par Stanislas Chable
Tags: Software Engineering

Soucieux de mon hygiène numérique et plus particulièrement des questions d'accès à mes données sur le web, je me suis intéressé aux services vantant leurs méthodes de chiffrement. Au cours de mes recherches, je me suis aperçu que le terme "chiffrement" était volontiers utilisé mais qu'il n'avait pas toujours la même signification. Voyons ce que l'on peut mettre derrière ce mot sur le web.

Qu'est-ce que le chiffrement ?

"Le chiffrement [...] est un procédé de cryptographie grâce auquel on souhaite rendre la compréhension d'un document impossible à toute personne qui n'a pas la clé de (dé)chiffrement."

Wikipedia<br>

Deux questions me viennent en tête à la lecture de cette définition :

  1. "à toute personne qui n'a pas la clé" : Mais alors, qui a la clé ?
  2. "la clé de (dé)chiffrement" : Mais alors, c'est une clé de chiffrement ou de déchiffrement ?

Nous allons explorer la deuxième question pour répondre à la première.

Pour savoir si une clé de chiffrement est également une clé de déchiffrement, nous allons nous intéresser aux différents types d'algorithmes existants en cryptographie.

Ensuite, et pour savoir qui détient la clé, nous allons nous intéresser aux différentes approches du chiffrement sur le web.

Les différents types d'algorithmes de chiffrement

Symétrique

Le chiffrement symétrique est un concept ne datant pas d'hier. Son utilisation remonte bien avant l'informatique. Avant même notre ère. La plus connue, qui s'illustre par sa simplicité, est celle qu'en fait Jules César : prenons le mot "web", décalons chaque lettre de 3 lettres plus loin dans l'alphabet, nous obtenons "zhe". "zhe" est la version chiffrée de "web". "3" est la clé de chiffrement. Pour déchiffrer "zhe", nous utilisons cette même clé "3" et procédons au décalage inverse.

Ce concept, même s'il utilise une suite d'opérations mathématiques plus complexes en informatique, reste similaire aujourd'hui. Il n'utilise qu'une seule clé, qui est utilisée à la fois pour chiffrer mais aussi pour déchiffrer la donnée. Nous comprenons donc que cette clé doit rester secrète.

Ce chiffrement est très répandu car peu gourmand en ressources.

L'algorithme de chiffrement symétrique le plus courant aujourd'hui est AES (Rijndael).

Alice connaît une clé secrète qu'elle utilise pour chiffrer un document. Elle envoie le document chiffré à Bob. Bob connaît également la clé secrète qu'il utilise pour déchiffrer le document.

Asymétrique

Le chiffrement asymétrique utilise quant à lui deux clés distinctes. Une pour chiffrer la donnée : la clé publique. Une pour déchiffrer la donnée : la clé privée. 
Ces clés vont par paire. Comme leur nom l'indique, la clé publique n'est pas secrète et doit être partagée tandis que la clé privée est secrète et ne doit jamais être communiquée.

Bob a ses deux clés (la publique et la privée). Alice utilise la clé publique de Bob pour chiffrer un document que seul Bob sera en mesure de déchiffrer. Bob utilise sa clé privée, que lui seul connaît, pour déchiffrer le document d'Alice.

Les deux algorithmes de chiffrement asymétriques les plus courants sur le web aujourd'hui sont RSA et ECDH (Elliptic Curve Diffie–Hellman). Ce dernier est utilisé afin de procéder à un échange de clés.

Alice connaît la clé publique de Bob qu'elle utilise pour chiffrer un document. Elle envoie le document chiffré à Bob. Bob seul connaît sa propre clé privé qu'il utilise pour déchiffrer le document.

Mais comment savoir quel type d'algorithme nous utilisons sur le web ?

Les différentes approches du chiffrement dans le Web

Nous pouvons identifier diverses approches du chiffrement sur le web. La différence se situe au niveau de l'emplacement des clés de (dé)chiffrement.

Plusieurs cas sont possibles :

Les clés ne sont connues que du serveur : le chiffrement au repos

La donnée est reçue non chiffrée par le serveur. Elle est ensuite chiffrée sur ce dernier qui crée et conserve la clé. C'est le mode de chiffrement privilégié par les services de stockage cloud. Les entreprises de services web l'utilisent pour empêcher la lecture des données stockées sur un disque, notamment en cas de vol physique de celui-ci. Il convient de garder à l'esprit que les données chiffrées au repos peuvent être déchiffrées par certains employés du service en question, puisque c'est lui qui détient les clés de chiffrement. Il y a toutefois généralement de rigoureuses politiques d'accès aux clés mises en place.

Pour connaître les algorithmes exacts utilisés, il faut aller chercher ce que veulent bien en révéler les entreprises en question. Pour Dropbox (service de stockage en ligne) par exemple, il s'agit de l'algorithme AES, donc d'un chiffrement symétrique.

Le client envoie un fichier non chiffré au serveur. Le serveur chiffre le fichier avec une clé secrète que lui seul connaît.

Les clés ne sont connues que du client : le chiffrement de bout en bout

La clé de chiffrement est générée par notre navigateur web (souvent à partir de notre mot de passe) et ne quitte jamais le navigateur. La donnée est chiffrée à l'aide de cette clé avant d'être envoyée au serveur. Ainsi, seul l'utilisateur est en possession de la clé, rendant impossible (non encore prouvé possible) la lecture de la donnée par le serveur qui la stocke ou la fait transiter.

C'est le mode de chiffrement généralement utilisé par les gestionnaires de mots de passe en ligne, les messageries sécurisées, ou les services mettant au cœur de leur business model la confidentialité des données de leurs utilisateurs.

Là encore, pour connaître le type d'algorithme de chiffrement utilisé, il faut aller chercher ce qu'en disent les entreprises en question. Mais souvent, les entreprises utilisant ce mode de chiffrement ont un code ouvert, et il appartient alors à toute personne qui en a les compétences d'aller vérifier dans le code que le chiffrement utilisé est bien celui indiqué.

Pour Bitwarden (gestionnaire de mots de passe) par exemple il s'agit de l'algorithme AES, donc de chiffrement symétrique.

Même chose pour Excalidraw (tableau blanc collaboratif).

Le client chiffre un fichier avec une clé secrète que lui seul connaît. Le client envoie le fichier chiffré au serveur qui ne connaît pas la clé.

Les clés sont connues du serveur et du client : le chiffrement en transit

Sur le web nous connaissons ce chiffrement via le protocole HTTPS, qui utilise TLS (évolution du plus ancien SSL) pour chiffrer les données envoyées par le navigateur à un site internet.

Ce type de chiffrement est extrêmement répandu sur le web (en août 2022 dans le monde, 80% des pages chargées par Firefox utilisent HTTPS). C'est son avènement qui a permis l'évolution du web vers ce que l'on connaît aujourd'hui. En effet, difficile d'imaginer sans lui un site de e-commerce : qui accepterait d'envoyer son numéro de carte bancaire de manière lisible ?

Le chiffrement en transit fait appel à plusieurs types de chiffrement. Voici son fonctionnement simplifié :

  1. Un algorithme de chiffrement asymétrique est utilisé : le navigateur génère une clé de chiffrement symétrique. Il chiffre cette clé avec la clé publique du serveur qu'il a reçue et lui envoie. Le serveur peut la déchiffrer à l'aide de sa clé privée.
  2. Un algorithme de chiffrement symétrique est utilisé : la clé générée par le navigateur, maintenant connue du client comme du serveur, servira à chiffrer leurs futurs échanges.

Le cadenas dans la barre d'adresse du navigateur nous indique l'utilisation du chiffrement en transit.

Étape 1 : Le client connaît la clé publique du serveur qu'il utilise pour chiffrer une clé secrète. Il envoie la clé chiffrée au serveur. Le serveur seul connaît sa propre clé privé qu'il utilise pour déchiffrer la clé secrète.
Le client et le serveur connaissent donc la même clé secrète.
Étape 2 : le client chiffre un document avec la clé secrète. Il envoie le document chiffré au serveur. Le serveur déchiffre le document à l'aide de la clé secrète.

Et pour les plus curieux, les algorithmes précis impliqués sont visibles dans le navigateur.
Firefox : Cadenas de la barre d'adresse > Connexion sécurisée > Plus d'informations > Onglet Sécurité section Détails techniques
Chrome : Cadenas de la barre d'adresse > La connexion est sécurisée > Certificat valide > Détails

Exemples du quotidien

Qu'il s'agisse de chiffrement au repos, de bout en bout ou en transit, ces différentes approches sont cumulables. Et c'est bien souvent le cas en pratique.

Exemple 1 : j'envoie un fichier sur Dropbox en HTTPS

Le chiffrement en transit et le chiffrement au repos sont utilisés :

  • Chiffrement en transit : mon ordinateur échange une clé de chiffrement symétrique avec Dropbox. Mon fichier est chiffré par mon navigateur avec cette clé puis est envoyé à Dropbox. Il arrive sur le serveur de ce dernier et est déchiffré.
  • Chiffrement au repos : Dropbox génère une clé de chiffrement symétrique et chiffre mon fichier avant de le stocker.

Exemple 2 : j'ajoute un identifiant à Bitwarden en HTTPS.

Le chiffrement en transit et le chiffrement de bout en bout sont utilisés :

  • Chiffrement de bout en bout : je me connecte à Bitwarden en entrant mon mot de passe. Ma clé de chiffrement symétrique est générée par mon navigateur d'après mon mot de passe. Je créer un identifiant. Cet identifiant est chiffré avec la clé générée.
  • Chiffrement en transit : L'identifiant chiffré avec ma clé est à nouveau chiffré, mais avec une clé échangée avec Bitwarden au préalable. Mon identifiant doublement chiffré est envoyé à Bitwarden. Il arrive sur le serveur de ce dernier et est déchiffré. Il reste alors sous la forme chiffrée avec la clé dérivée de mon mot de passe. Bitwarden ne connaît pas cette clé qui n'a jamais quitté mon navigateur et ne peut donc pas le déchiffrer avant de le stocker.

Un mot sur le hash

Le hash est souvent associé au chiffrement, alors qu'en réalité c'est un procédé différent qui ne répond pas au même besoin.

Un algorithme de hachage (il en existe plusieurs) a pour but de générer rapidement, à partir d'une donnée (un document, une vidéo, un mot de passe…), un ensemble de caractères unique. Nous pouvons voir cela comme une empreinte. C'est une opération à sens unique qui ne permet pas de recalculer le document d'origine à partir du hash (il n'existe pas de clé de (dé)chiffrement).

Pour une même donnée, l'empreinte calculée avec un même algorithme sera identique.

En revanche, si nous modifions cette donnée, ne serait-ce que faiblement, l'empreinte, toujours calculée avec le même algorithme, sera totalement différente.

Calculer le hash sur une donnée permet donc de vérifier qu'elle n'a pas été modifiée, en comparant l'empreinte d'origine à l'empreinte obtenue. Cela répond au besoin de s'assurer de l'intégrité de la donnée, contrairement au chiffrement qui répond au besoin de s'assurer de la confidentialité de la donnée.

Le cas des mots de passe

Sur le web, le hash est généralement utilisé pour le stockage de mots de passe, afin d'éviter de pouvoir les déchiffrer au cas où la base de données serait compromise.

Mais pour ne pa pouvoir les reconnaître à partir de leur hash qui serait connu (il existe des tables de correspondance entre mots de passe fréquemment utilisés et hashes), un sel est utilisé par l'algorithme de hachage. Un sel est une donnée aléatoire ajoutée au mot de passe d'origine pour le calcul du hash. Deux mots de passe identiques hachés avec un même algorithme mais avec un sel différent auront donc une empreinte différente. Impossible alors de savoir que les mots de passe sont en fait les mêmes.

Contrairement aux fonctions de hachage classiques qui sont rapides, dans le cas spécifique d'un mot de passe, nous chercherons à ralentir le calcul du hash afin de limiter les attaques par force brute.

Ce sont donc les mots de passe salés et hachés qui sont comparés afin de savoir si le mot de passe saisi par l'utilisateur est le bon, et non les mots de passe sous forme non chiffrée.

Différents algorithmes de hachage :

Conclusion

Le web serait bien différent de ce qu'il est maintenant si la cryptographie ne s'était pas développée.

La cryptographie nous rend plusieurs services en permettant d'assurer la confidentialité, l'intégrité et l'authentification d'une donnée.
Si nous avons évoqué les deux premiers avec respectivement le chiffrement et le hash, le troisième sert à vérifier l'origine d'une donnée. Utilisant une paire de clés, la clé privée sert à générer une signature qui peut être vérifiée par la clé publique.
Ces trois services bien distincts sont souvent liés les uns aux autres, et certains algorithmes permettent d'assurer à la fois la confidentialité, l'intégrité et/ou l'authentification.

Utilisant tous ces services, notre navigation quotidienne sur le web entraîne quasi systématiquement des opérations de chiffrement. La présence généralisée du protocole HTTPS en atteste. C'est d'ailleurs lui qui a permis le web tel qu'on le connaît aujourd'hui : avec la possibilité de s'assurer de l'origine d'un site web, de payer des achats en ligne de manière sécurisée, ou de remplir des formulaires avec des données personnelles pour des besoins administratifs par exemple.

Deux types d'algorithmes de chiffrement ont rendu possible le chiffrement en transit : symétrique et asymétrique.
Le chiffrement symétrique ne possède qu'une seule et unique clé qui doit rester secrète. Elle sert à chiffrer et à déchiffrer de la donnée.
Le chiffrement asymétrique utilise quant à lui une paire de clés : une clé publique sert à chiffrer de la donnée tandis qu'une clé privée sert à la déchiffrer.

Ce tour d'horizon nous a permis de constater qu'il existe sur le web bien des approches au chiffrement :

  • en transit
  • au repos
  • de bout en bout

Si les algorithmes utilisés sont parfois les mêmes d'une approche à une autre, toutes ne se valent pas d'un point de vue confidentialité. Le fait qu'un service se vante de l'utilisation d'un algorithme de chiffrement robuste n'est à lui seul pas gage de confidentialité. Il convient de se demander : où sont les clés ?