Comment fonctionne le hashage ?
On l'utilise pour les mots de passes et d'autres vérifications de sécurité, mais qu'est-ce qu'un hash ?
Article publié le 27/01/2022, dernière mise à jour le 19/09/2023
Le hashage consiste à faire passer une donnée d'une taille arbitraire dans une fonction qui va la transformer en une donnée d'une taille définie.
Pour les mots de passe par exemple, la taille de sortie est souvent plus grande que l'entrée.
Contrairement au chiffrement, une fonction de hashage est destructive (ou unilatéral) car on perd de la donnée d'origine, il est impossible de revenir en arrière.
Concept simplifié
Prenons une fonction de hashage théorique la plus simple possible, disons que notre fonction prend une chaine de caractère en entrée, et retourne sa taille :
f(x) => taille(x)
Ce qui nous donne "bonjour" => 7, "password" => 8 et "chien" => 5
Pourquoi utiliser un hash ?
Pour les mots de passe
On voit bien dans l'exemple précédent, qu'une fois passé dans la fonction, le mot de passe n'est plus récupérable, donc si on le stocke dans une base de données, il est "protégé".
Impossible de récupérer le mot "bonjour" à partir du simple chiffre 7
Pour l'authentification, il suffira de hasher en direct le mot de passe fourni par l'utilisateur et le comparer au hash stocké dans la base, car la fonction de hashage doit toujours retourner le même hash pour la même donnée en entrée.
Pour simplifier/représenter des données
Un hash est une représentation simplifiée d'une donnée. Il existe beaucoup d'algorithmes différent, mais la bonne pratique veut que deux hashs, issus de deux données quasi-similaires à quelques bits près, soient eux, très différents.
Exemple théorique: le hash du mot "hello" égal "ABCDEF" tandis que le hash de "hellp" égal "ZYXWV"
Ce qui signifie que la comparaison entre les hashs, plutôt que les données d'origines est plus optimisée, car les premiers bits du hash sont déjà différents.
Et dans le cas de comparaison de gros fichier, le hash utilisé sera beaucoup plus léger que l'entièreté des données contenues, donc la comparaison sera plus efficace, c'est ce que l'on appelle le "checksum".
Quels algorithmes ?
Vous l'aurez compris, le problème avec notre fonction de hashage simplifiée, ce sont les collisions. Car en l'occurence, le hash de "bonjour" est égal à 7 mais le hash de "baisers" est aussi égal à 7, c'est ce que l'on appelle une collision, est c'est l'une des problématiques du hashage.
En pratique, les fonctions de hashage cryptographique génère des hash assez longs, parfois plus longs que la valeur d'entrée, par exemple le hash du mot "bonjour" avec l'algorithme SHA-256 est égale à :
2cb4b1431b84ec15d35ed83bb927e27e8967d75f4bcd9cc4b25c8d879ae23e18
alors que le hash du mot "baisers" est égal à :
73beed7425bd31551890c0727f4b169cd99b5c708fa8d50a713747e0878e2580
La complexité d'une algorithme de hashage réside dans son ratio entre le temps d'exécution et le nombre de collisions possibles, par exemple la famille d'algorithme SHA est plus rapide à s'exécuter, mais son nombre de collision possible est plus élevé que d'autres algorithme comme le Bcrypt.
À moins que la contrainte de temps d'exécution soit une grosse problématique, il est recommandé d'utiliser l'algorithme BCrypt pour les mots de passe par exemple.
Mais il existe également d'autres algorithmes encore plus rapides, car les collisions sont moins critiques, comme le hash MD5 qui est très rapide et permet de faire du checksum de manière efficace !
Aucun commentaire pour l'instant