Aller au contenu principal
CipherChronicle

Glossaire de cryptographie

Hash

Aussi appelé : Empreinte cryptographique · Hachage · Digest

Un hash (ou empreinte cryptographique, digest en anglais) est une chaîne de longueur fixe — typiquement 32, 64 ou 256 caractères hexadécimaux — calculée à partir d’une donnée d’entrée arbitraire par une fonction de hachage. Le hash sert d’« empreinte digitale » de la donnée : deux entrées différentes ont (sauf collision) deux hashes différents, et la même entrée donne toujours le même hash.

Trois propriétés essentielles

  1. Déterminisme : la même entrée donne toujours le même hash. Ça paraît trivial mais c’est ce qui rend le hash vérifiable : on peut toujours recalculer et comparer.
  2. Effet d’avalanche : la moindre modification de l’entrée change l’empreinte de fond en comble. Changer un seul bit du clair fait basculer environ la moitié des bits du hash. Aucun moyen de prédire « si je change tel caractère, le hash bougera de telle façon ».
  3. Sens unique : impossible (en pratique, en temps humain) de retrouver l’entrée à partir du hash. C’est ce qui distingue un hash d’un chiffrement — le chiffrement est réversible avec la clé, le hash ne l’est jamais. On ne « déshashe » pas.

À ces trois propriétés, on ajoute la résistance aux collisions : il doit être pratiquement impossible de trouver deux entrées différentes produisant le même hash. Pour SHA-256, on estime cette probabilité à 1 sur 2¹²⁸ — astronomique.

Les algorithmes principaux

AlgorithmeBits de sortieStatut
MD5128Cassé (collisions trouvées en 2004). À éviter.
SHA-1160Cassé (collisions Google en 2017). Encore vu en legacy.
SHA-256256Standard actuel. Utilisé par Bitcoin, TLS, Git, CipherChronicle.
SHA-3 / Keccak224-512Standard NIST 2015, alternative à SHA-2. Utilisé par Ethereum.
BLAKE2 / BLAKE3256+Plus rapide que SHA-256, qualité équivalente.
Argon2 / bcrypt / scryptvariableKDF dérivés du hash, conçus pour être lents (mots de passe).

La distinction Argon2 versus SHA-256 mérite d’être bien comprise. SHA-256 est volontairement rapide — c’est ce qu’on veut quand on hashe des fichiers ou des transactions. Pour les mots de passe, c’est exactement ce qu’on ne veut pas : un attaquant qui rapatrie une fuite de base peut tester des milliards de candidats par seconde. Argon2, bcrypt, scrypt sont conçus pour être lents et coûteux en mémoire — chaque hash prend 100 ms et 64 Mo de RAM, ce qui rend le brute-force quasi impraticable.

Trois usages canoniques

1. Stockage de mots de passe

Aucune base sérieuse ne stocke les mots de passe en clair. On stocke hash = Argon2(password + salt). À la connexion, on rehash la saisie utilisateur et on compare. Si la base fuite, l’attaquant doit refaire le brute-force par utilisateur (grâce au sel) avec une fonction lente (grâce à Argon2). Les fuites massives qu’on voit dans la presse — quand des centaines de millions de mots de passe se retrouvent en circulation — concernent presque toujours des sites qui stockaient en MD5 sans sel, ou en clair pur.

2. Vérification d’intégrité

Quand vous téléchargez une distribution Linux (Ubuntu, Arch), le site publie le SHA-256 de l’ISO. Vous calculez le SHA-256 du fichier téléchargé et comparez. Si les deux correspondent, le fichier n’a pas été altéré en route. C’est la base des signatures numériques : on signe le hash, pas le fichier (signer un fichier de 4 Go serait absurde).

3. Validation de solutions sans révélation

Sur CipherChronicle, on utilise SHA-256 pour stocker les solutions des puzzles. Quand un auteur publie une grille, on calcule :

hash = SHA-256(solution + puzzleId)

Et on stocke uniquement ce hash dans Firestore — jamais la solution en clair. Quand un solveur tape sa tentative, son navigateur recalcule le hash localement et le compare au hash stocké. Aucun clair ne circule jamais sur nos serveurs, et même un dump complet de la base ne révèle aucune solution. Le préfixe puzzleId empêche les rainbow tables : deux puzzles avec la même solution ont des hashes différents.

C’est aussi ce mécanisme qui anime le mining Bitcoin : trouver un nonce tel que SHA-256(SHA-256(bloc)) commence par N zéros. Pas de raccourci : il faut essayer des milliards de nonces, c’est précisément cette « preuve de travail » qui sécurise le réseau.

À ne pas confondre

  • Hash ≠ chiffrement : un chiffrement est réversible avec la clé, un hash ne l’est jamais. On hashe pour vérifier ; on chiffre pour transmettre.
  • Hash ≠ encodage : Base64, hex sont des encodages réversibles sans clé. Un hash ne se décode pas.
  • Hash ≠ compression : la compression est réversible. Le hash perd irréversiblement de l’information (4 Go d’entrée → 32 octets de sortie).

À retenir :

  • Un hash est une empreinte de taille fixe, déterministe, à sens unique, avec effet d’avalanche.
  • Standards modernes : SHA-256, SHA-3, BLAKE3 pour l’usage général. Argon2 / bcrypt / scrypt pour les mots de passe.
  • Trois usages : stocker des mots de passe, vérifier l’intégrité d’un fichier, valider sans révéler (puzzles, blockchain).
  • À ne jamais confondre avec un chiffrement : on hashe pour vérifier, on chiffre pour transmettre.

← Tout le glossaire