Fonctions de Hachage Cryptographiques : Guide Complet
Les fonctions de hachage cryptographiques sont les chevaux de bataille silencieux de la sécurité moderne. Chaque fois que vous vous connectez à un site web, poussez du code vers Git, téléchargez un fichier ou effectuez une transaction Bitcoin, les fonctions de hachage travaillent en coulisse. Pourtant, la plupart des développeurs interagissent avec elles quotidiennement sans vraiment comprendre ce qu'elles font — ni ce qui peut terriblement mal tourner quand elles sont mal utilisées.
Ce guide couvre tout : les mathématiques, l'histoire, les algorithmes cassés, les normes modernes et le code pratique dont vous avez besoin pour utiliser correctement les fonctions de hachage.
1. Que Sont les Fonctions de Hachage Cryptographiques ?
Une fonction de hachage cryptographique prend une entrée de taille quelconque et produit une sortie de taille fixe, appelée condensé ou valeur de hachage. Par exemple, SHA-256 produit toujours exactement 256 bits (64 caractères hexadécimaux), que l'entrée soit un seul caractère ou un fichier de film entier.
Propriétés Fondamentales
Déterministe : La même entrée produit toujours la même sortie. SHA-256("hello") retournera toujours 2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824.
Calcul rapide : Le calcul d'un hachage devrait prendre des millisecondes. Cette efficacité est essentielle pour les vérifications d'intégrité des fichiers et les signatures numériques, bien qu'elle devienne un problème pour le hachage de mots de passe (plus à ce sujet plus tard).
Résistance à la préimage (unidirectionnelle) : Étant donné une sortie de hachage H, il doit être computationnellement impossible de trouver une entrée m telle que hash(m) = H. On ne peut pas retrouver les données originales à partir du hachage seul.
Résistance à la seconde préimage : Étant donné une entrée m1, il doit être impossible de trouver une entrée différente m2 telle que hash(m1) = hash(m2). Même si un attaquant connaît vos données originales, il ne peut pas trouver une entrée différente qui produit le même hachage.
Résistance aux collisions : Il doit être impossible de trouver un quelconque couple d'entrées distinctes m1 et m2 tel que hash(m1) = hash(m2). C'est une exigence plus forte que la résistance à la seconde préimage.
Effet avalanche : Un petit changement dans l'entrée — même un seul bit inversé — modifie complètement la sortie. Changer "hello" en "hellp" produit un hachage entièrement différent sans relation apparente avec l'original.
SHA-256("hello") = 2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824
SHA-256("hellp") = 9b71d224bd62f3785d96d46ad3ea3d73319bfbc2890caadae2dff72519673ca7
Ces deux hachages ne partagent aucune relation prévisible — c'est l'effet avalanche en action.
2. Brève Histoire des Algorithmes de Hachage
MD5 (1991)
Ronald Rivest a conçu MD5 comme amélioration de MD4. Il produit un condensé de 128 bits et a été largement adopté dans les années 1990 pour les sommes de contrôle et le stockage des mots de passe. Pendant plus d'une décennie, MD5 était le choix par défaut pour de nombreuses applications de sécurité.
SHA-1 (1995)
L'Agence de Sécurité Nationale (NSA) a conçu SHA-1 (Secure Hash Algorithm 1) dans le cadre du Digital Signature Standard. Il produit un condensé de 160 bits. SHA-1 est devenu l'algorithme de hachage dominant pour les certificats TLS/SSL, la signature de code et le stockage d'objets Git.
Famille SHA-2 (2001)
Également conçu par la NSA, SHA-2 est en réalité une famille de six fonctions : SHA-224, SHA-256, SHA-384, SHA-512, SHA-512/224 et SHA-512/256. SHA-256 et SHA-512 sont les plus couramment utilisés. Ils produisent des condensés de 256 et 512 bits respectivement et restent sécurisés aujourd'hui.
SHA-3 / Keccak (2015)
Lorsque les faiblesses de SHA-1 sont devenues évidentes, le NIST a organisé un concours public (2007-2015) pour trouver un tout nouveau standard de hachage indépendant de la conception SHA-2 de la NSA. Le gagnant était Keccak, conçu par Guido Bertoni, Joan Daemen, Michaël Peeters et Gilles Van Assche. Contrairement à SHA-2 qui utilise une construction Merkle–Damgård, SHA-3 utilise une construction éponge, offrant un profil de sécurité fondamentalement différent.
BLAKE2 (2012)
BLAKE2 est une fonction de hachage cryptographique plus rapide que MD5 tout en offrant la sécurité de SHA-3. Elle a été conçue par Jean-Philippe Aumasson, Samuel Neves, Zooko Wilcox-O'Hearn et Christian Winnerlein comme amélioration de BLAKE, qui était finaliste au concours SHA-3. BLAKE2b est optimisé pour les plates-formes 64 bits ; BLAKE2s pour 32 bits.
3. Comment Fonctionne SHA-256
SHA-256 utilise la construction Merkle–Damgård : le message est découpé en blocs de taille fixe, et une fonction de compression est appliquée de manière itérative, en utilisant la sortie d'un bloc comme entrée du suivant.
Étape 1 : Rembourrage
Le message d'entrée est rembourrée pour que sa longueur totale soit un multiple de 512 bits. Un seul bit 1 est ajouté, suivi de zéros, suivi de la longueur originale du message sous forme d'entier 64 bits en format big-endian.
Étape 2 : Calendrier de Messages
Chaque bloc de 512 bits est étendu en 64 mots de 32 bits en utilisant un calendrier qui mélange et fait pivoter les bits. Les mots W[0] à W[15] proviennent directement du bloc de message ; les mots W[16] à W[63] sont calculés comme :
W[i] = σ1(W[i-2]) + W[i-7] + σ0(W[i-15]) + W[i-16]
Où σ0 et σ1 sont des opérations spécifiques de rotation et de décalage de bits.
Étape 3 : Compression — 64 Tours
SHA-256 maintient 8 variables de travail (a à h), initialisées avec les parties fractionnaires des racines carrées des 8 premiers nombres premiers. Pour chacun des 64 tours :
T1 = h + Σ1(e) + Ch(e,f,g) + K[i] + W[i]
T2 = Σ0(a) + Maj(a,b,c)
h = g; g = f; f = e; e = d + T1
d = c; c = b; b = a; a = T1 + T2
Les constantes de tour K[i] sont les parties fractionnaires des racines cubiques des 64 premiers nombres premiers — un choix de conception qui prévient la critique du "rien dans la manche" en rendant les constantes publiquement vérifiables.
Étape 4 : Sortie
Après traitement de tous les blocs, les 8 variables de travail sont ajoutées aux valeurs de hachage initiales pour produire le condensé final de 256 bits. Ce "feed-forward" garantit que la sortie de chaque bloc dépend de tous les blocs précédents.
4. Pourquoi MD5 et SHA-1 Sont Cassés
Collisions MD5 (2004)
En 2004, Xiaoyun Wang et ses collègues ont démontré des attaques par collision pratiques contre MD5 — trouvant deux entrées différentes qui produisent le même hachage MD5. En 2008, des chercheurs ont utilisé des collisions MD5 pour forger un faux certificat SSL d'une vraie autorité de certification, démontrant une attaque réelle contre l'infrastructure HTTPS.
L'attaque utilise une cryptanalyse différentielle sophistiquée et peut générer des collisions MD5 en quelques secondes sur du matériel moderne.
SHA-1 SHAttered (2017)
L'équipe Project Zero de Google et CWI Amsterdam ont produit la première collision SHA-1 pratique en 2017, baptisée SHAttered. Ils ont généré deux fichiers PDF différents avec des hachages SHA-1 identiques. L'attaque a nécessité environ 9,2 × 10¹⁸ calculs SHA-1 — équivalent à 6 500 ans de temps CPU simple — mais seulement environ 110 ans de temps GPU, à la portée des États-nations et des grandes organisations.
Ce Que Cela Signifie en Pratique
MD5 et SHA-1 ne sont PAS sûrs pour :
- Les signatures numériques
- Les empreintes de certificats
- Le stockage de mots de passe
- Toute application sensible à la sécurité
Ils sont encore acceptables pour :
- Les sommes de contrôle non cryptographiques (vérification de l'intégrité de téléchargement de fichiers via un canal de confiance)
- Les recherches dans des tables de hachage
- La déduplication non liée à la sécurité
- La compatibilité avec les systèmes hérités (avec des mises en garde appropriées)
5. Cas d'Utilisation Réels
Stockage de Mots de Passe
Ne jamais stocker les mots de passe en texte clair — ni même sous forme de hachages simples. Si votre base de données est divulguée, un attaquant peut craquer les hachages simples à l'aide d'attaques par dictionnaire ou de tables arc-en-ciel en quelques heures ou jours.
L'approche correcte utilise une fonction de hachage lente et salée spécialement conçue pour les mots de passe : bcrypt, scrypt ou Argon2.
Vérification de l'Intégrité des Fichiers
Lorsque vous téléchargez un logiciel, le développeur fournit une somme de contrôle SHA-256. Après le téléchargement, vous calculez le hachage du fichier et le comparez. S'ils correspondent, le fichier n'a pas été corrompu ou altéré en transit.
sha256sum downloaded-file.tar.gz
# Comparer avec la somme de contrôle publiée par le développeur
Signatures Numériques
Les fonctions de hachage sont fondamentales pour les signatures numériques. Plutôt que de signer un document entier (qui pourrait faire des gigaoctets), vous le hachez et signez uniquement le hachage. Le destinataire hache le document indépendamment et vérifie la signature par rapport à ce hachage.
Blockchain
Bitcoin utilise SHA-256 deux fois (SHA-256d) pour le minage par preuve de travail et pour hacher les blocs de transactions. Les mineurs doivent trouver une entrée (nonce) qui, lorsqu'elle est hachée, produit une sortie avec un certain nombre de zéros en tête — un processus qui nécessite un effort computationnel énorme et fournit les garanties de sécurité de la blockchain.
Stockage d'Objets Git
Git utilise SHA-1 pour hacher chaque objet commit, arbre et blob. Le hachage sert à la fois d'identifiant de l'objet et de vérification d'intégrité. Git migre activement vers SHA-256 en raison des faiblesses de SHA-1.
Déduplication dans les Systèmes de Stockage
Les systèmes de sauvegarde et le stockage adressable par contenu (comme IPFS) utilisent des hachages pour identifier le contenu dupliqué. Si deux fichiers ont le même hachage, ils ne sont stockés qu'une seule fois.
6. Calcul de Hachages en Pratique
JavaScript (Node.js)
const crypto = require('crypto');
// SHA-256
const sha256 = crypto.createHash('sha256')
.update('Hello, World!')
.digest('hex');
console.log(sha256);
// 315f5bdb76d078c43b8ac0064e4a0164612b1fce77c869345bfc94c75894edd3
// MD5 (utiliser uniquement à des fins non liées à la sécurité)
const md5 = crypto.createHash('md5')
.update('Hello, World!')
.digest('hex');
console.log(md5);
// 65a8e27d8879283831b664bd8b7f0ad4
// SHA-512
const sha512 = crypto.createHash('sha512')
.update('Hello, World!')
.digest('hex');
console.log(sha512);
Python
import hashlib
# SHA-256
h = hashlib.sha256(b"Hello, World!").hexdigest()
print(h)
# 315f5bdb76d078c43b8ac0064e4a0164612b1fce77c869345bfc94c75894edd3
# SHA-512
h512 = hashlib.sha512(b"Hello, World!").hexdigest()
print(h512)
# Plusieurs algorithmes
for algo in ['md5', 'sha1', 'sha256', 'sha512']:
h = hashlib.new(algo, b"Hello, World!").hexdigest()
print(f"{algo}: {h}")
Bash / Terminal
# SHA-256
echo -n "Hello, World!" | sha256sum
# 315f5bdb76d078c43b8ac0064e4a0164612b1fce77c869345bfc94c75894edd3 -
# MD5
echo -n "Hello, World!" | md5sum
# 65a8e27d8879283831b664bd8b7f0ad4 -
# SHA-1
echo -n "Hello, World!" | sha1sum
# Hacher un fichier
sha256sum /path/to/file.iso
7. HMAC : Code d'Authentification de Message Basé sur le Hachage
Un simple hachage vérifie l'intégrité des données — il vous dit si les données ont été corrompues. Mais il ne vérifie pas l'authenticité — il ne prouve pas qui a créé les données. N'importe qui peut calculer un hachage.
HMAC (RFC 2104) résout ce problème en combinant une clé secrète avec la fonction de hachage :
HMAC(K, m) = hash((K' ⊕ opad) || hash((K' ⊕ ipad) || m))
Où K' est la clé complétée à la taille du bloc, et opad/ipad sont des constantes de rembourrage spécifiques. Cette construction est prouvablement sécurisée si la fonction de hachage sous-jacente est sécurisée.
Utilisations Courantes
Authentification d'API : Les APIs REST utilisent HMAC-SHA256 pour signer les requêtes. Le serveur et le client partagent une clé secrète. Le client signe le corps de la requête avec la clé ; le serveur vérifie la signature.
Signatures JWT : Les JSON Web Tokens utilisent HMAC-SHA256 (HS256) pour signer l'en-tête et la charge utile, garantissant que le token n'a pas été altéré.
Vérification de Webhooks : GitHub, Stripe et de nombreux autres services signent les charges utiles de webhooks avec HMAC-SHA256 pour que les destinataires puissent vérifier l'authenticité de la charge utile.
Calcul de HMAC
// Node.js
const crypto = require('crypto');
const hmac = crypto.createHmac('sha256', 'ma-cle-secrete')
.update('message à authentifier')
.digest('hex');
console.log(hmac);
import hmac
import hashlib
key = b'my-secret-key'
message = b'message to authenticate'
sig = hmac.new(key, message, hashlib.sha256).hexdigest()
print(sig)
8. Tables Arc-en-Ciel et Salage
Qu'est-ce que les Tables Arc-en-Ciel ?
Une table arc-en-ciel est une base de données précalculée qui fait correspondre des valeurs de hachage connues à leurs entrées en texte clair originales. Si un attaquant obtient votre base de données de hachages de mots de passe, il n'a pas besoin de craquer chaque hachage individuellement — il le recherche simplement dans la table.
Pour MD5 et SHA-1, des tables arc-en-ciel couvrant tous les mots de passe ASCII jusqu'à 8 caractères sont disponibles gratuitement depuis des années. Des sites web comme CrackStation maintiennent des bases de données de milliards de correspondances hachage-mot de passe.
Comment le Salage Défait les Tables Arc-en-Ciel
Un sel est une valeur aléatoire ajoutée au mot de passe avant le hachage :
hash(sel + mot_de_passe) = hachage_stocké
Le sel est stocké avec le hachage (il n'a pas besoin d'être secret). Comme chaque utilisateur obtient un sel aléatoire unique, l'attaquant ne peut pas utiliser de tables précalculées — il aurait besoin d'une table arc-en-ciel séparée pour chaque valeur de sel possible, ce qui est computationnellement impossible.
bcrypt : Salage Automatique et Lenteur Intentionnelle
bcrypt a été conçu en 1999 spécifiquement pour le hachage de mots de passe. Il génère et incorpore automatiquement un sel aléatoire, et inclut un facteur de coût qui contrôle la lenteur du calcul du hachage :
const bcrypt = require('bcrypt');
// Hacher un mot de passe (facteur de coût 12 — prend ~250ms sur du matériel moderne)
const hash = await bcrypt.hash('mot-de-passe-utilisateur', 12);
// Vérifier
const isMatch = await bcrypt.compare('mot-de-passe-utilisateur', hash);
Le hachage stocké ressemble à : $2b$12$EixZaYVK1fsbw1ZfbX3OXePaWxn96p36WQoeG6Lruj3vjPGga31lW
Le préfixe $2b$12$ encode la version de l'algorithme et le facteur de coût — bcrypt gère tout automatiquement.
9. Tableau Comparatif des Algorithmes
| Algorithme | Taille de Sortie | Vitesse | Statut de Sécurité | Meilleure Utilisation |
|---|---|---|---|---|
| MD5 | 128 bits | Très rapide | ❌ Cassé (collisions) | Sommes de contrôle non sécurisées seulement |
| SHA-1 | 160 bits | Rapide | ❌ Cassé (SHAttered) | Systèmes hérités seulement |
| SHA-256 | 256 bits | Rapide | ✅ Sécurisé | Usage général, TLS, signatures |
| SHA-512 | 512 bits | Rapide sur 64 bits | ✅ Sécurisé | Applications haute sécurité |
| SHA-3/Keccak | Variable | Modéré | ✅ Sécurisé | Alternative à SHA-2 |
| BLAKE2b | Variable | Très rapide | ✅ Sécurisé | Hachage critique en performance |
| bcrypt | 184 bits | Lent (intentionnel) | ✅ Sécurisé | Stockage de mots de passe |
| Argon2id | Variable | Lent (intentionnel) | ✅ Sécurisé | Stockage de mots de passe (recommandé) |
10. Meilleures Pratiques pour le Hachage de Mots de Passe
Les mots de passe méritent un traitement spécial car ils sont les clés des comptes utilisateurs. Une base de données de mots de passe compromise peut être dévastatrice. Suivez ces règles sans exception :
Règle 1 : Ne Jamais Stocker les Mots de Passe en Clair
Cela devrait être évident, mais cela arrive encore. En 2019, Facebook a été découvert en train de stocker en interne des centaines de millions de mots de passe en texte clair.
Règle 2 : Ne Jamais Utiliser des Hachages Rapides pour les Mots de Passe
MD5, SHA-1, SHA-256 et SHA-512 sont tous trop rapides pour le hachage de mots de passe. Un GPU moderne peut calculer des milliards de hachages SHA-256 par seconde, permettant des attaques par force brute en quelques heures.
Règle 3 : Utiliser des Algorithmes de Hachage Conçus Spécifiquement pour les Mots de Passe
bcrypt (minimum recommandé) : Utiliser un facteur de coût de 12 ou supérieur. Largement supporté, éprouvé au combat.
scrypt : Intensif en mémoire, le rendant résistant aux attaques GPU et ASIC. Coûts de mémoire et CPU configurables.
Argon2id (recommandé aujourd'hui) : Gagnant du concours de hachage de mots de passe 2015. Argon2id est la variante recommandée car elle offre une résistance aux attaques par canaux auxiliaires et aux attaques par compromis temps-mémoire. Configurer avec au minimum :
- Mémoire : 64 Mo
- Itérations : 3
- Parallélisme : 4
Règle 4 : Utiliser un Sel Unique par Mot de Passe
Même avec bcrypt/scrypt/Argon2 (qui incluent le salage automatique), comprenez pourquoi c'est important : des mots de passe identiques doivent produire des hachages différents pour que compromettre l'un ne révèle pas les autres.
Règle 5 : Ajuster les Facteurs de Coût au Fil du Temps
À mesure que le matériel devient plus rapide, augmenter les facteurs de coût. Viser ~250-500ms pour bcrypt. Rehacher les mots de passe à la prochaine connexion.
Règle 6 : Considérer l'Utilisation du Poivre
Un poivre est un secret côté serveur (contrairement au sel, il n'est pas stocké dans la base de données). Il est ajouté au mot de passe avant le hachage : hash(poivre + sel + mot_de_passe). Même si un attaquant vole votre base de données, il ne peut pas craquer les mots de passe sans le poivre.
Conclusion
Les fonctions de hachage cryptographiques sont fondamentales pour la sécurité, l'intégrité et la confiance sur l'ensemble d'Internet. Les comprendre — de leurs propriétés mathématiques à leurs vulnérabilités pratiques — vous permet de construire des systèmes véritablement sécurisés.
Les points clés à retenir :
- SHA-256 et SHA-512 sont vos fonctions de hachage d'usage général
- MD5 et SHA-1 sont cassés pour les usages cryptographiques
- Pour les mots de passe, toujours utiliser bcrypt, scrypt ou Argon2
- Utiliser HMAC quand vous avez besoin d'authentification, pas seulement d'intégrité
- Le salage défait les tables arc-en-ciel ; bcrypt et Argon2 le font automatiquement
Utilisez le Générateur de Hachage Tool3M pour calculer rapidement des hachages SHA-256, SHA-512, MD5 et autres directement dans votre navigateur — sans installation requise.