Aller au contenu principal

Hachage sécurisé

SHA-256, bcrypt

Notions théoriques

1. Introduction au hachage

Le hachage est un procédé qui transforme une donnée en une empreinte unique et de longueur fixe.

attention

Contrairement au chiffrement, le hachage est une opération irréversible, ce qui signifie qu’il est impossible de retrouver les données d’origine à partir de leur empreinte.

Les algorithmes de hachage sont utilisés pour :

  • Stocker les mots de passe de manière sécurisée.
  • Vérifier l’intégrité des fichiers et des messages.
  • Générer des signatures numériques.

Un bon algorithme de hachage doit être :

  • Déterministe : La même entrée produit toujours la même sortie.
  • Rapide : L’empreinte est générée en un temps court.
  • Résistant aux collisions : Deux entrées différentes ne doivent pas produire la même empreinte.
  • Résistant à l’inversion : Impossible de retrouver l’entrée d’origine à partir de l’empreinte.

2. SHA-256 : Un algorithme de hachage sécurisé

SHA-256 (Secure Hash Algorithm 256 bits) est un algorithme de hachage de la famille SHA-2.
Il produit une empreinte de 256 bits (64 caractères hexadécimaux).

Avantages :

  • Sécurisé et largement utilisé (TLS, Bitcoin, signatures numériques).
  • Résistant aux attaques classiques (préimage, collision).

Inconvénients :

  • Trop rapide pour stocker des mots de passe : vulnérable aux attaques par force brute.

Exemple d’empreinte SHA-256 :

SHA-256("motdepasse123") → 
ef92b778bafe771e89245b89ecbcf1be1a9b3b4a5a2c6b5f6f3b2b1e1c0d8e3f

3. bcrypt : Un hachage sécurisé pour les mots de passe

bcrypt est un algorithme de hachage conçu pour protéger les mots de passe.
Il introduit un sel (salt) et un facteur de coût pour ralentir les attaques.

Fonctionnement :

  1. Un sel (chaîne aléatoire) est ajouté au mot de passe avant le hachage.
  2. Un facteur de coût détermine le nombre d’itérations, rendant le calcul plus long.
  3. L’empreinte obtenue est stockée avec le sel.

Avantages :

  • Protège contre les attaques par force brute et les attaques par dictionnaire.
  • Rend les attaques plus coûteuses grâce au facteur de coût.

Exemple d’empreinte bcrypt :

bcrypt("motdepasse123") → 
$2b$12$9b8e7f5c8a6d4e3f1b0c9a1b2d3e4f5g6h7i8j9k0l1m2n3o4p5q6r

Exemple pratique

Il est possible de générer des empreintes SHA-256 et bcrypt en Python avec les bibliothèques hashlib et bcrypt.

1. Générer un hachage SHA-256

import hashlib

mot_de_passe = "motdepasse123"
empreinte_sha256 = hashlib.sha256(mot_de_passe.encode()).hexdigest()

print("SHA-256 :", empreinte_sha256)

2. Générer un hachage bcrypt

import bcrypt

mot_de_passe = b"motdepasse123"
sel = bcrypt.gensalt()
empreinte_bcrypt = bcrypt.hashpw(mot_de_passe, sel)

print("bcrypt :", empreinte_bcrypt.decode())

3. Vérifier un mot de passe avec bcrypt

mot_de_passe_test = b"motdepasse123"
if bcrypt.checkpw(mot_de_passe_test, empreinte_bcrypt):
print("Mot de passe correct")
else:
print("Mot de passe incorrect")

Test de mémorisation/compréhension


Quelle est la principale caractéristique du hachage ?


Quel algorithme produit une empreinte de 256 bits ?


Pourquoi bcrypt est-il recommandé pour stocker les mots de passe ?


Quelle est la taille d’une empreinte SHA-256 en hexadécimal ?


Quel est le rôle du sel dans bcrypt ?


Pourquoi SHA-256 seul n’est-il pas recommandé pour les mots de passe ?


Quel algorithme est utilisé dans Bitcoin pour sécuriser les transactions ?


Que signifie le facteur de coût dans bcrypt ?


Quelle bibliothèque Python permet de générer un hachage SHA-256 ?


Comment vérifier un mot de passe haché avec bcrypt en Python ?



TP pour réfléchir et résoudre des problèmes

L’objectif de ce TP est de manipuler les algorithmes de hachage SHA-256 et bcrypt afin de comprendre leur fonctionnement et leur utilisation pour sécuriser les mots de passe.

Il s'agit de créer un programme interactif permettant de :

  • Hacher un mot de passe avec SHA-256.
  • Hacher un mot de passe avec bcrypt.
  • Vérifier si un mot de passe correspond à une empreinte bcrypt stockée.

Étape 1 : Préparer l’environnement de travail

Avant de commencer, il est important de s’assurer que les bibliothèques nécessaires sont installées.

Instructions :

  1. Ouvrir un terminal et vérifier que Python est installé :
python --version
  1. Installer la bibliothèque bcrypt si elle n’est pas déjà installée :
pip install bcrypt
  1. Créer un dossier de travail pour organiser les fichiers :
mkdir hachage
cd hachage
  1. Créer trois fichiers Python pour séparer les différentes parties du TP :
touch hachage_sha256.py hachage_bcrypt.py verification_bcrypt.py
Une solution

Étape 2 : Implémenter le hachage SHA-256

L’algorithme SHA-256 est utilisé pour générer une empreinte unique et irréversible d’un mot de passe.
L’objectif est de créer un programme qui demande un mot de passe à l’utilisateur, le hache avec SHA-256 et affiche l’empreinte.

Instructions :

  1. Ouvrir le fichier hachage_sha256.py dans un éditeur de texte.
  2. Importer la bibliothèque hashlib pour utiliser SHA-256 :
import hashlib
  1. Demander un mot de passe à l’utilisateur :
mot_de_passe = input("Entrez un mot de passe : ")
  1. Convertir le mot de passe en empreinte SHA-256 :
empreinte_sha256 = hashlib.sha256(mot_de_passe.encode()).hexdigest()
  1. Afficher l’empreinte SHA-256 :
print("Empreinte SHA-256 :", empreinte_sha256)
  1. Exécuter le script et tester avec différents mots de passe :
python hachage_sha256.py
Une solution

Étape 3 : Implémenter le hachage bcrypt

L’algorithme bcrypt est conçu pour sécuriser les mots de passe en ajoutant un sel unique et en rendant le hachage plus lent pour contrer les attaques par force brute.

Instructions :

  1. Ouvrir le fichier hachage_bcrypt.py dans un éditeur de texte.
  2. Importer la bibliothèque bcrypt :
import bcrypt
  1. Demander un mot de passe à l’utilisateur :
mot_de_passe = input("Entrez un mot de passe : ").encode()
  1. Générer un sel aléatoire :
sel = bcrypt.gensalt()
  1. Hacher le mot de passe avec bcrypt :
empreinte_bcrypt = bcrypt.hashpw(mot_de_passe, sel)
  1. Afficher l’empreinte bcrypt :
print("Empreinte bcrypt :", empreinte_bcrypt.decode())
  1. Exécuter le script et observer les résultats :
python hachage_bcrypt.py
Une solution

Étape 4 : Vérifier un mot de passe avec bcrypt

L’objectif est maintenant de comparer un mot de passe saisi par un utilisateur avec une empreinte bcrypt préalablement générée.

Instructions :

  1. Ouvrir le fichier verification_bcrypt.py dans un éditeur de texte.
  2. Importer la bibliothèque bcrypt :
import bcrypt
  1. Demander un mot de passe à l’utilisateur :
mot_de_passe = input("Entrez un mot de passe : ").encode()
  1. Demander une empreinte bcrypt stockée (simulée ici par une saisie utilisateur) :
empreinte_stockee = input("Entrez l’empreinte bcrypt : ").encode()
  1. Vérifier si le mot de passe correspond à l’empreinte :
if bcrypt.checkpw(mot_de_passe, empreinte_stockee):
print("Mot de passe correct")
else:
print("Mot de passe incorrect")
  1. Tester le programme en utilisant une empreinte générée précédemment.
python verification_bcrypt.py
Une solution

Étape 5 : Automatiser la gestion des mots de passe

L’objectif est de créer un programme interactif permettant :

  1. D’enregistrer un mot de passe haché avec bcrypt.
  2. De vérifier un mot de passe à partir d’une empreinte stockée.

Instructions :

  1. Créer un fichier gestion_mdp.py.
  2. Ajouter un menu interactif permettant de choisir entre :
    • Hacher un mot de passe.
    • Vérifier un mot de passe.
  3. Utiliser bcrypt pour stocker et comparer les mots de passe.
Une solution