cryptography security encryption devops

Concepts avancés de cryptographie : du CSPRNG à la Forward Secrecy

Une exploration des briques de base de la cryptographie moderne, notamment les CSPRNG, l'AEAD, les fonctions de dérivation de clés et les principes de la Perfect Forward Secrecy.

Concepts avancés de cryptographie : du CSPRNG à la Forward Secrecy

À une époque de violations de données omniprésentes et de surveillance sophistiquée parrainée par les États, le rôle de la cryptographie est passé d'une discipline académique de niche au fondement de l'économie numérique. Bien que de nombreux développeurs soient familiers avec les concepts de base tels que le « hachage » ou le « chiffrement symétrique », la sécurité réelle d'un système dépend souvent de primitives plus avancées et nuancées.

Dans ce guide, nous explorerons les composants critiques qui rendent possibles les protocoles cryptographiques modernes comme TLS 1.3 et Signal : de la génération du hasard à la garantie que les secrets d'aujourd'hui restent en sécurité même si les clés de demain sont compromises.


1. Le fondement du hasard : CSPRNG

Chaque opération cryptographique commence par un secret, et chaque secret commence par le hasard. Cependant, dans le monde des ordinateurs — qui sont fondamentalement des machines déterministes — le véritable hasard est étonnamment difficile à trouver.

Qu'est-ce qu'un CSPRNG ?

Un Générateur de Nombres Pseudo-Aléatoires Cryptographiquement Sûr (CSPRNG) est un algorithme spécialisé conçu pour produire des séquences de nombres impossibles à distinguer d'un véritable bruit aléatoire. Contrairement aux PRNG standard (comme Math.random() en JavaScript), un CSPRNG doit satisfaire à deux exigences critiques :

  1. Test du bit suivant : Étant donné les k premiers bits d'une séquence, un attaquant disposant d'une puissance de calcul illimitée ne devrait pas être capable de prédire le $(k+1)$-ième bit avec une probabilité significativement supérieure à 50 %.
  2. Résistance à la compromission d'état : Si l'état interne du générateur est compromis, il devrait être impossible de reconstruire les sorties aléatoires précédentes (résistance au retour en arrière) ou de prédire les sorties futures (résistance à la prédiction, à condition d'ajouter une nouvelle entropie).

La source d'entropie

Un CSPRNG n'est efficace que si sa source d'entropie l'est aussi. Les systèmes d'exploitation modernes collectent du « bruit » à partir d'événements matériels — tels que le timing du clavier, les mouvements de la souris, les interruptions d'E/S du disque et le bruit thermique — pour initialiser le générateur. Sous Linux, cela est géré par /dev/urandom.


2. Chiffrement authentifié avec données associées (AEAD)

Pendant des décennies, on a appris aux développeurs à chiffrer pour la confidentialité et à utiliser un MAC (comme HMAC) pour l'intégrité. Cette approche « Encrypt-then-MAC » est sûre mais sujette à des erreurs d'implémentation.

L'essor de l'AEAD

L'AEAD (Authenticated Encryption with Associated Data) simplifie cela en fournissant à la fois confidentialité et intégrité dans une seule primitive cryptographique. Lorsque vous utilisez un mode AEAD comme AES-GCM ou ChaCha20-Poly1305, l'algorithme produit :

  1. Texte chiffré : Les données cryptées.
  2. Tag d'authentification : Une somme de contrôle cryptographique qui prouve que le texte chiffré n'a pas été altéré.

Données associées (AD)

La partie « AD » vous permet d'authentifier des données qui ne sont pas chiffrées. Par exemple, dans un paquet réseau, l'en-tête (contenant l'IP de destination) doit rester en texte clair pour que les routeurs puissent le lire, mais il doit être authentifié pour qu'un attaquant ne puisse pas modifier la destination sans être détecté.


3. Fonctions de dérivation de clés (KDF)

Vous ne devriez jamais utiliser un mot de passe brut comme clé de chiffrement. Les humains choisissent des mots de passe prévisibles, tandis que les algorithmes cryptographiques nécessitent des chaînes de bits à haute entropie et uniformément réparties.

Que fait une KDF ?

Une Fonction de dérivation de clés (KDF) prend une source d'entropie (comme un mot de passe ou un secret partagé issu d'un échange de clés) et « étire » ou « dérive » une ou plusieurs clés cryptographiquement fortes à partir de celle-ci.

Normes KDF modernes

  • PBKDF2 : Une ancienne norme qui utilise le hachage répété pour ralentir les attaques par force brute.
  • Argon2 : Le gagnant de la Password Hashing Competition (PHC), conçu pour résister au cassage par GPU et ASIC.
  • HKDF (KDF basé sur HMAC) : Largement utilisé dans des protocoles comme TLS 1.3 pour dériver plusieurs clés indépendantes (par exemple, une clé de chiffrement et une clé d'authentification) à partir d'un seul secret partagé.

4. Échange de clés éphémères et Forward Secrecy

L'un des concepts les plus puissants de la cryptographie moderne est la Perfect Forward Secrecy (PFS).

Le problème des clés statiques

Dans les anciennes versions de SSL, le serveur utilisait une clé privée RSA statique pour échanger des clés de session. Si un attaquant enregistrait tout votre trafic chiffré pendant des années, puis réussissait à voler la clé privée du serveur, il pourrait revenir en arrière et déchiffrer tout le trafic historique qu'il avait collecté.

La solution : Échange de clés éphémères

Les protocoles modernes utilisent l'Échange Diffie-Hellman éphémère (DHE) ou l'Échange Diffie-Hellman sur courbes elliptiques éphémère (ECDHE).

  • Éphémère signifie que les clés sont temporaires ; une nouvelle paire de clés unique est générée pour chaque session.
  • Une fois la session terminée, les clés sont effacées de la mémoire.

Atteindre la Forward Secrecy

Comme la clé d'identité à long terme du serveur n'est utilisée que pour signer l'échange (prouvant l'identité du serveur) plutôt que pour chiffrer les clés de session, la compromission de la clé à long terme n'aide pas un attaquant à déchiffrer le trafic passé. C'est le standard d'excellence pour la vie privée.


5. Résumé : Construire un système sécurisé

Pour construire une application moderne et sécurisée, vous devriez suivre ces modèles architecturaux :

  1. Générez des secrets en utilisant un CSPRNG fourni par le système (par exemple, crypto.getRandomValues() dans le navigateur ou crypto.randomBytes() dans Node.js).
  2. Stockez les mots de passe en utilisant Argon2 ou Scrypt.
  3. Protégez les données au repos en utilisant un mode AEAD comme AES-256-GCM.
  4. Protégez les données en transit en utilisant TLS 1.3 avec ECDHE pour la Forward Secrecy.
  5. Dérivez des sous-clés en utilisant HKDF plutôt que de réutiliser la même clé maître à des fins différentes.

En comprenant ces concepts avancés, vous allez au-delà du simple fait de « cocher la case » de la sécurité et commencez à construire des systèmes résilients face aux menaces actuelles et aux vulnérabilités futures.