Seb-Info

Hachez vos données

Hachez vos données

Hachez vos données

Le chiffrement vous permet de protéger la confidentialité de vos données à l’aide d’une clé secrète. Cependant, il existe un autre type de cryptographie qui n’utilise pas de clé, qu’on appelle la cryptographie sans secret, et qui est principalement composée de fonctions de hachage cryptographique. Je vous propose de nous pencher en détail sur cette fonction de hachage.

Appréhendez la terminologie des fonctions de hachage

Qu’est-ce qu’une fonction de hachage ?

Cette fonction est déterministe, c’est-à-dire que pour la même donnée en entrée, elle fournit toujours la même donnée en sortie, appelée haché ou empreinte. Ainsi, si vous calculez le haché de deux données et que ces deux hachés sont différents, vous êtes certain que les deux données sont elles-mêmes différentes.

Il est beaucoup plus rapide de comparer des hachés, qui ont un format fixe et une petite taille, plutôt que de comparer des données de grande taille comme des fichiers. Les fonctions de hachage sont donc très utilisées en informatique. Par exemple, une table de hachage (hashtable) est un tableau de clés/valeurs dont la clé est le haché de la valeur.

Utilisez des fonctions de hachage cryptographiques

Ces fonctions sont largement utilisées en cryptographie pour  :

  1. Contrôler l’intégrité d’un message

La première application d’une fonction de hachage cryptographique est de protéger l’intégrité d’un message ou d’un fichier, en calculant l’empreinte (ou le haché) du message. Vous verrez comment faire un contrôle d’intégrité dans le prochain chapitre. L’empreinte d’un fichier peut également servir d’identifiant unique du fichier, dans la mesure où le risque d’une collision est pratiquement nul. Quand on télécharge un fichier (ex. ISO Linux), on publie aussi son empreinte SHA-256. L’utilisateur peut recalculer le hash pour vérifier que le fichier n’a pas été modifié ou corrompu.

  • Stocker des mots de passe

Les mots de passe sont des données particulièrement sensibles.

On ne stocke jamais les mots de passe en clair dans une base de données. On enregistre leur empreinte hachée (souvent avec un sel = valeur aléatoire ajoutée) → lors de la connexion, on re-hachera le mot de passe saisi et on compare les empreintes.

Lorsqu’un serveur vérifie qu’un utilisateur connaît son mot de passe, le serveur n’a pas besoin de connaître la valeur du mot de passe, mais uniquement de vérifier que l’empreinte du mot de passe saisi correspond à l’empreinte du mot de passe enregistré. Le serveur ne stocke donc pas le mot de passe dans sa base de données, mais il stocke l’empreinte du mot de passe avec une fonction de hachage de mot de passe.

Lorsque l’utilisateur fournit son mot de passe pour s’authentifier, le serveur calcule alors le haché de ce mot de passe et compare la valeur du haché fourni avec la valeur du haché enregistré. Si les hachés sont identiques, le mot de passe est valide.

Ainsi, si un attaquant vole la base de données du serveur, il ne pourra pas directement retrouver les mots de passe. L’inconvénient est que si l’utilisateur oublie son mot de passe, le serveur ne pourra pas le lui redonner, car il ne le connaît pas lui-même.

Ex. : bcrypt, Argon2 (spécialisés pour le hachage de mots de passe).

  • Pour la signature numérique et les certificats

Quand on veut signer numériquement un document ou un message, on doit prouver : l’intégrité : le message n’a pas été modifié et l’authenticité : il vient bien de l’expéditeur.

Or un message peut être très long (un fichier PDF de 100 Mo, par exemple).
Signer tout le fichier avec une clé privée RSA/ECDSA serait très coûteux en calcul.

On applique une fonction de hachage cryptographique (ex : SHA-256) au message. Le message → hash (empreinte de 256 bits, soit 64 caractères hexadécimaux). On signe ce hash avec la clé privée, au lieu de signer tout le message.

Quand quelqu’un reçoit le message et la signature :

  1. Il recalcule le hash du message reçu.

  2. Il déchiffre la signature avec la clé publique de l’expéditeur (cela donne le hash signé).

  3. Il compare les deux empreintes.

    • Si elles sont identiques → message authentique et non altéré.

    • Sinon → message modifié ou signature invalide.

  • Indexation et recherche rapide

Les tables de hachage (hash tables) permettent un accès très rapide aux données en associant une clé à un hash. Utilisé dans les bases de données, les compilateurs, les langages (ex : dictionnaires en Python, HashMap en Java).

  • Blockchain et crypto-monnaie

Chaque bloc contient le hash du bloc précédent → garantit la non-altération de la chaîne.Les transactions sont aussi vérifiées par des fonctions de hachage cryptographiques

Vous utilisez alors une graine aléatoire (issue de l’entropie externe) en entrée de la fonction de hachage, et le haché fourni en sortie est le nombre pseudo-aléatoire. Il est ensuite possible d’utiliser le haché précédent comme entrée de la fonction de hachage pour générer le nombre pseudo-aléatoire suivant, et ainsi de suite.

Le salage

Attaques par tables arc-en-ciel (rainbow tables)

1. Le problème initial

Quand on stocke un mot de passe avec un simple hachage (ex. SHA-256("azerty")), le résultat est toujours le même.
Cela veut dire que si deux utilisateurs ont le même mot de passe, ils auront le même hash en base.

Un attaquant qui récupère la base de données peut comparer ces hash à des hash déjà calculés (plus rapide qu’une attaque par dictionnaire simple)

Plutôt que de tester chaque mot de passe au hasard (brute force), on peut :

  • prendre une liste de mots de passe possibles (ex. “azerty”, “123456”, “password”),

  • calculer une fois pour toutes leurs hash (SHA-256("azerty") = 65c7…),

  • stocker le tout dans une énorme base appelée dictionnaire.

Ensuite, il suffit de comparer le hash volé avec ceux du dictionnaire pour retrouver rapidement le mot de passe.


2. Tables arc-en-ciel

Une table arc-en-ciel est une version optimisée de ces dictionnaires :

  • on ne stocke pas tous les hash (cela prendrait trop de place),

  • on utilise des techniques mathématiques (chaînes de hash et fonctions de réduction) pour compresser l’information,

  • cela permet de retrouver un mot de passe à partir d’un hash connu en explorant les chaînes au lieu de stocker tout brute.

Si on voulait pré-calculer tous les mots de passe possibles et leurs hash, la table serait gigantesque (des téraoctets, voire des pétaoctets).Pour économiser de la place, on n’enregistre pas tous les couples (mot de passe → hash), mais seulement des points de départ et des points d’arrivée de chaînes calculées. Résultat : au lieu d’occuper des téraoctets, la table arc-en-ciel permet de couvrir un espace énorme de mots de passe avec moins de stockage.

Hachage des mots de passe en PHP : sel (salt), explications et exemples

Pour contrer les attaques par dictionnaire ou tables arc-en-ciel (rainbow tables), on ajoute un sel
(salt) : une valeur aléatoire unique concaténée au mot de passe avant hachage, ce qui rend chaque empreinte
unique même pour des mots de passe identiques.

En PHP moderne, password_hash() gère automatiquement le sel (inclus dans la chaîne résultante) et
password_verify() vérifie correctement un mot de passe. On évite ainsi de gérer le sel soi-même.


1) Inscription : hacher et stocker le mot de passe

À l’inscription, on récupère le mot de passe saisi, on génère un hash sécurisé avec password_hash()
(qui inclut un sel aléatoire) et on stocke la chaîne entière (ex. préfixe $2y$... pour bcrypt).

Exemple PHP (inscription)

<?php
// Exemple minimal : penser à valider/sanitariser les entrées réelles
$plain = $_POST['password'] ?? 'MonSuperSecret!';

// Hash sécurisé (le sel est généré et stocké automatiquement dans la chaîne)
$hash = password_hash($plain, PASSWORD_DEFAULT);

// Exemple d'insertion : stocker la chaîne ENTIEREMENT (VARCHAR(255) suffit)
$sql = "INSERT INTO users(email, password_hash) VALUES(:email, :hash)";
$stmt = $pdo->prepare($sql);
$stmt->execute([
    ':email' => $_POST['email'],
    ':hash'  => $hash
]);

echo "Compte créé. Hash stocké : " . htmlspecialchars($hash);
À retenir : password_hash() inclut un sel unique et gère le format du hash ;
on n’a pas besoin (ni intérêt) de gérer une colonne salt séparée.

2) Connexion : vérifier le mot de passe

À la connexion, on récupère le hash depuis la base (via l’email, par ex.) puis on utilise
password_verify() pour comparer de façon sûre le mot de passe saisi et le hash stocké.
On peut aussi réhausser la sécurité au fil du temps avec password_needs_rehash().

Exemple PHP (connexion)

<?php
// Récupérer le hash stocké pour cet email
$sql = "SELECT password_hash FROM users WHERE email = :email";
$stmt = $pdo->prepare($sql);
$stmt->execute([':email' => $_POST['email']]);
$stored = $stmt->fetchColumn();

if ($stored && password_verify($_POST['password'], $stored)) {
    // Optionnel : rehash si l'algo ou le "coût" souhaité a évolué
    if (password_needs_rehash($stored, PASSWORD_DEFAULT, ['cost' => 12])) {
        $newHash = password_hash($_POST['password'], PASSWORD_DEFAULT, ['cost' => 12]);
        $upd = $pdo->prepare("UPDATE users SET password_hash = :h WHERE email = :e");
        $upd->execute([':h' => $newHash, ':e' => $_POST['email']]);
    }
    echo "Connexion OK";
} else {
    echo "Identifiants invalides";
}

3) Paramétrage : bcrypt et Argon2id

PASSWORD_DEFAULT utilise aujourd’hui bcrypt (sujet à évoluer avec PHP). Vous pouvez expliciter
bcrypt avec un coût plus élevé, ou préférer Argon2id (recommandé si disponible) en ajustant les paramètres
mémoire/temps/threads selon votre serveur.

Exemples PHP (paramètres)

<?php
$plain = $_POST['password'] ?? 'MonSuperSecret!';

// Bcrypt avec coût augmenté
$hash_bcrypt = password_hash($plain, PASSWORD_BCRYPT, ['cost' => 12]);

// Argon2id (si disponible) : ajuster selon la machine
$hash_argon2id = password_hash($plain, PASSWORD_ARGON2ID, [
    'memory_cost' => 1 << 17,  // ~131072 KB
    'time_cost'   => 2,          // itérations
    'threads'     => 2
]);

4) Bonnes pratiques sécurité

  • Utiliser password_hash() / password_verify() (ne jamais comparer des hash “à la main”).
  • Activer HTTPS (TLS), limiter les tentatives (anti-bruteforce), journaliser.
  • Envisager un pepper applicatif (secret serveur) en plus du sel interne : hash(password + pepper) puis password_hash().
  • Monter progressivement le “coût” (bcrypt) ou memory_cost/time_cost (Argon2id) selon la puissance serveur.
  • Utiliser des requêtes préparées PDO et valider les entrées côté serveur.

Les conditions de sécurité d’une fonction de hachage cryptographique

Voici les 3 conditions de sécurité qui permettent à une fonction de hachage d’être utilisée en cryptographie :

Être résistante à la 1e préimage

Si vous connaissez la valeur du haché (aussi appelé image) H d’une donnée D, mais que vous ne connaissez pas la valeur de la donnée D (aussi appelée préimage de H), il est impossible de retrouver cette valeur D.

On dit aussi que la fonction de hachage est une fonction à sens unique ou irréversible, c’est-à-dire qu’il n’existe pas de fonction inverse qui, en prenant le haché H en entrée, fournit la valeur initiale D (ou préimage) en sortie.

Ainsi, si vous fournissez le haché d’une donnée, cela ne vous donne aucune information sur la valeur de cette donnée. Il est toujours possible de retrouver la préimage par la recherche exhaustive, c’est-à-dire en essayant toutes les valeurs de donnée possibles, en calculant leur haché et en le comparant à la valeur de haché H. Cependant, cette attaque n’est pas réalisable si l’espace des données initiales est suffisamment grand, c’est-à-dire de taille supérieure à 2^128.

Être résistante aux collisions

Il doit être impossible de trouver une collision pour n’importe quelle valeur de haché.

La résistance aux collisions n’implique pas que les collisions n’existent pas (elles existent forcément, comme expliqué dans le paragraphe suivant) mais qu’il est difficile d’en trouver une, c’est-à-dire qu’il n’y a pas d’algorithme plus rapide que la recherche aléatoire pour trouver une collision.

Je vous ai perdu ? Cette règle est en fait liée au paradoxe des anniversaires. Ce paradoxe dit qu’il suffit de 23 élèves dans une classe pour que la probabilité que 2 élèves aient leur anniversaire le même jour soit supérieure à 50 %. Dans cet exemple, les élèves sont les données et leur anniversaire est le haché, qui a 365 valeurs possibles. On dit que c’est un paradoxe, car  23 est une valeur bien inférieure à ce qu’on pourrait imaginer intuitivement.

Ainsi, pour une résistance aux collisions équivalente à la sécurité d’un algorithme de chiffrement de 128 bits, une fonction de hachage doit avoir une taille de haché de 256 bits.

Être pseudo-aléatoire

Le haché d’une donnée doit être imprévisible et ne pas avoir de corrélation avec la donnée initiale. En pratique, cela signifie qu’une infime modification de la donnée initiale, par exemple le changement d’un seul bit, conduit à un nouveau haché totalement différent du haché initial.

Schéma de collision
Schéma de collision

Dans le schéma, vous pouvez voir une collision entre 2 messages. 2 messages différents ont le même haché.

Apprenez-en plus sur les algorithmes de hachage cryptographiques

Avec le développement des fonctions de hachage, le gouvernement américain a sélectionné des fonctions de hachage qui se sont imposées comme standard :

  • la première version, SHA-1 (Secure Hash Algorithm version 1) est aujourd’hui considérée comme vulnérable, car des chercheurs ont démontré qu’il était possible de trouver des collisions, et l’ont prouvé en créant 2 fichiers PDF différents ayant le même haché avec SHA-1. Il ne faut donc plus l’utiliser ;

  • depuis 2002, la seconde version, SHA-2, est La fonction standard de hachage cryptographique. C’est donc la fonction de hachage qu’il vous est conseillé d’utiliser. Elle est déclinée en plusieurs versions, dont SHA-256 dont le haché est de 256 bits ; elle fournit une sécurité de 128 bits contre les collisions et est la plus utilisée actuellement ;

  • en 2015, une troisième version, SHA-3, a été sélectionnée comme alternative à SHA-2. Cette fonction ne remplace pas SHA-2 qui est toujours la fonction conseillée. Elle servira d’alternative dans le cas où des chercheurs réussiraient à casser la sécurité de SHA-2 à l’avenir.

Il existe également d’autres algorithmes de hachage sécurisés, comme BLAKE, qui a l’avantage d’être particulièrement rapide.

En résumé

  • Les fonctions de hachage permettent de calculer une empreinte de taille fixe pour n’importe quel message ;

  • connaître la valeur d’un haché ne permet pas de retrouver la valeur du message original ;

  • grâce à la résistance aux collisions, si deux messages ont le même haché, les deux messages peuvent être considérés comme étant identiques ;

  • la fonction de hachage sécurisé recommandée est SHA2 avec des hachés de 256 bits.

Vidéos :

Attention qui trouvera le mot de passe dont le hash est :

3dc6862aaced087142142587cba2123e

Ce contenu est réservé aux membres du site. Si vous êtes un utilisateur existant, veuillez vous connecter. Les nouveaux utilisateurs peuvent s'inscrire ci-dessous.

Connexion pour les utilisateurs enregistrés
   
Nouvel utilisateur ?
*Champ requis
Powered by WP-Members