Une fonction de hachage prend en paramètre une donnée de n'importe quelle taille et retourne une chaîne de caractère unique avec une taille fixe qui est une sorte d'empreinte digitale de la donnée originale.
Vous pouvez trouver un exemple classique d'utilisation du hachage si vous allez par exemple [télécharger une version de la distribution Linux Ubuntu](https://ubuntu.com/download/desktop). Vous trouverez sur la page de téléchargement un lien "*Vérifier votre téléchargement*" qui vous indiquera le hash du fichier que vous avez téléchargé.
L'idée ici est de vous permettre de vérifier par vous-mêmes que le fichier qui se trouve sur votre disque dur n'a pas été corrompu et qu'il s'agit bien du même fichier que celui créée par les équipes d'Ubuntu.
Comment cela fonctionne ? Les équipes Ubuntu après avoir produit le fichier ont calculé son hachage et l'ont mis sur la page. De votre côté, vous pouvez calculer le hachage du fichier que vous venez de télécharger avec la commande : `sha256sum ubuntu-22.04-desktop-amd64.iso`. Bien que le fichier iso fasse presque 4 GO, si un seul octet est différent
du fichier crée par les équipes Ubuntu, les deux hachages calculés seront complètement différents.
Cette fonction nous permet donc de vérifier l'intégrité et l'authenticité d'une donnée grâce ce que l'on appelle la "*résistance à la seconde pré-image*" qui implique qu'il est statistiquement impossible de trouver une seconde entrée qui a la même valeur de hachage qu’une entrée spécifiée.
Pour faire simple, si je vous donne un hachage d'une chaîne de caractère, il est statistiquement impossible que vous trouviez une autre chaîne de caractère différente qui donnera le même résultat pour son hachage.
Dans notre exemple, nous avons utilisé `sha256` qui produira, peu importe la taille de la donnée en entrée, une sortie de 256 bits. Bien entendu, il produit, à partir d'une même entrée, la même sortie à chaque fois. Il est aussi important de noter que ces fonctions sont non réversibles, elles ne fonctionnent que dans un sens. Cela signifie qu'à partir du hash, il est impossible de retrouver la chaîne d'origine, c'est ce que l'on appelle la "*résistance à la pré-image*".
La troisième propriété d'une fonction de hachage est la "*résistance à la collision*", elle garantit que personne n'est capable de créer deux entrées qui donneront la même valeur de hachage.
## SHA-2
SHA-2 est la fonction de hachage la plus utilisée. Elle a été développée par la NSA et standardisée par le NIST en 2001. Il est le successeur de SHA-1 qui ne doit plus être utilisé, car il a été cassé à plusieurs reprises par des chercheurs qui ont montré qu'ils arrivaient à produire des collisions grâce à une plus grande puissance de calcul, mais grâce aussi à des failles dans leur conception.
SHA-2 a 4 versions différentes : 224, 256, 384 & 512. La version 256 est la plus utilisée et garantie les trois propriétés décrites précédemment.
Sur le fonctionnement, tout commence par une fonction de "compression", c'est une fonction qui prend en entrée deux chaines et qui produit une chaîne de la taille d'une des entrées :
`azgeiudjzndu` ==> `lodjenquekri`
`yjeodaajduzd`
Dans le cas de SHA-2, la fonction de compression utilisée s'appelle "Davies-Meyer". Si l'on veut utiliser SHA-256, la première chose va être de découper notre chaîne d'entrée en bock de 512 bits (64 bytes), car c'est la taille que supporte "Davies-Meyer" en entrée.
Si jamais notre chaîne de caractère n'est pas un multiple de 512, l'algorithme va rajouter des caractères pour que cela soit le cas. Ensuite, l'algorithme de compression va être utilisé de manière itérative sur chacun des blocs découpés à partir de notre chaîne originale.
## SHA-3
SHA-3 est la suite de SHA-2 et a pour objectif de corriger ses problèmes et d'offrir une meilleure sécurité. Cet algorithme est basé sur les permutations et utilise les "*constructions en éponges*" qui n'ont rien à voir avec les procédés Merkle-Damgard.