Dessine-moi un mot de passe

ou le hachage cryptographique pour les nuls

Théo Gianella
LFT
27/09/2024

Fonction de hachage ???

Fonction de hachage ???

Donnée de taille variable
Condensé de taille fixe

Déterministe : le même input donne toujours le même output

Illustration par Julien Piatek

Concrètement ça donne quoi ?

Exemples (MD5)

"Bedrock"

3836cb55cf42c53ba498574eec35623c

3229f96e5769da329fd0aa662844d777

e829cb1f9911c3f763d0c86e3fabc207

Exemples (MD5)

"Bedrock"

3836cb55cf42c53ba498574eec35623c

"Bedrack"

acc536f0f7278b11f4dd33460337ded7

Pourquoi hacher ?

Pourquoi hacher ?

  • Stockage en clair : dangereux 👀
  • Chiffrement : repousse le problème 🙈
  • Hachage : permet de vérifier une donnée sans la connaître → aucun secret ! 🤷
  • Pas de secrets → pas de problèmes ! 🥳

Reconnaître sans connaître

Reconnaître sans connaître

  • Création du compte : le mot de passe en clair est haché puis effacé 🗑
  • Identification: le mot de passe en clair est haché et comparé au condensé stocké. 🔍

Le jeu de la vie

Le jeu de la vie

  • Un jeu à 0 joueurs
  • Une grille en 2D
  • Des cases à l'état binaire
  • Une génération = un état de la grille
  • Chaque cellule dépend des 8 voisines

Les 4 règles du jeu de la vie

Les 4 règles du jeu de la vie

  • Une cellule vivante qui a moins de deux voisins meurt
  • Une cellule vivante avec deux ou trois voisins survit
  • Une cellule vivante avec plus de trois voisins meurt
  • Une cellule morte avec exactement trois voisins devient vivante

Une fonction de hachage ?

50 générations

Avertissement

L'expérience que vous allez voir a été réalisée par un professionnel entraîné

Ne la reproduisez pas chez vous

Ne stockez jamais de vraies données d'utilisateurs avec un algorithme maison

Recette pour faire une fonction de hachage

Recette pour faire une fonction de hachage

  1. Décoder le mot de passe en binaire
  2. Utiliser les bits pour initialiser un jeu de la vie
  3. Laisser le jeu de la vie s'exécuter
  4. Récupérer les bits de l'état final
  5. Encoder les bits en base64

👨‍🎨 Demo time ! 🎨

La fonction idéale

La fonction idéale

L'oracle aléatoire
  • Une fonction qui associe à chaque entrée possible une sortie unique et complètement aléatoire
  • Unique : une fonction déterministe
  • Aléatoire : aucun rapport entre l'entrée et la sortie

Mesurer l'aléatoire: le biais

Mesurer l'aléatoire: le biais

Le condensé d'un oracle aléatoire est... aléatoire !

Autrement dit, chaque caractère possible du condensé est statistiquement aussi fréquent

Autrement dit, chaque bit a 50% de chance
d'être 1 ou 0

La diffusion

La diffusion

Objectif : aucune corrélation apparente entre le texte en clair et le condensé

Autrement dit, deux entrées très proches doivent donner deux condensés totalement différents

Autrement dit, si je change un bit de l'entrée, tous les bits de la sortie doivent avoir une chance sur deux de changer

Les natures mortes

Les natures mortes

  • Des motifs stables
  • Une fois atteints, s'ils ne sont pas perturbés, ils ne bougent plus jamais
  • Motifs qui ont une structure, donc prévisibles

Le compromis biais-diffusion

Le compromis biais-diffusion

Un paramètre sur lequel on peut jouer: le nombre de générations

Plus le nombre de générations augmente, plus les changements se diffusent

... mais plus le biais augmente !

Exemple

Etat initial

Après 10 générations
Après 1000 générations

Vulnérabilités

Vulnérabilités

  • Collisions 💥
  • Attaques de préimage 🖼️
  • Inversion du hash ↩️

Les collisions

Les attaques de préimage

Les attaques de préimage

Type particulier de collision

Trouver une collision particulière à partir d'un condensé donné

Autrement dit : trouver un autre mot de passe qui fonctionne

Le défaut du jeu de la vie

Le défaut du jeu de la vie

L'oracle aléatoire peut produire tous les condensés imaginables, mais pas le jeu de la vie

Sortie en 256 bits = 2 ^ 256 condensés possibles théoriquement mais en pratique beaucoup moins

Certains condensés ne seront jamais produits car certaines configurations de la grille sont inatteignables

Les jardins d'Eden

Les jardins d'Eden

  • Une configuration qui n'a pas d'ancêtres
  • Aucun état ne peut le produire
  • Série de bits impossible à retrouver comme sortie de la fonction

Le paradoxe du jeu de la vie

Le paradoxe du jeu de la vie

Grand nombre d'ancêtres pour chaque état

Les collisions sont omniprésentes

Attaques de préimage très faciles

Beaucoup de mots de passe pour le même condensé

Il est très difficile de trouver le vrai !

Avertissement

L'expérience que vous venez de voir a été réalisée par un professionnel entraîné

Ne la reproduisez pas chez vous

Ne stockez jamais de vraies données d'utilisateurs avec un algorithme maison

recommandations

recommandations

Utilisez des algorithmes modernes

Argon2 scrypt bcrypt
Application
OpenFeedback