Commit 86e1422b authored by Fabrice's avatar Fabrice
Browse files

chiffrement et hachage

parent 58448695
Loading
Loading
Loading
Loading
+35 −3
Original line number Diff line number Diff line
@@ -60,17 +60,49 @@ Le **hachage cryptographique (SHA-256, bcrypt)** est basé sur des **fonctions m
- Toute modification de X **change complètement** Y (**effet avalanche**).
- Il est **impossible de retrouver X à partir de Y** (la fonction n'est pas *bijective* mais *surjective*).

Le hachage est un processus qui transforme une entrée (comme un message ou un fichier) en une valeur de longueur fixe appelée empreinte ou digest. Cette empreinte permet de garantir l'intégrité des données, car toute modification de l'entrée entraînera un changement total du hachage. Par exemple, dans le stockage de mots de passe, le mot de passe est haché avant d'être stocké, de sorte qu'il est impossible de récupérer le mot de passe d'origine à partir du hash. Le hachage est également utilisé dans des mécanismes comme les signatures numériques pour garantir l'authenticité des messages sans exposer leur contenu.

Voici une liste d'exemples concrets d'utilisation du **hachage** dans différents domaines :

#### 1️⃣ **Stockage sécurisé des mots de passe**
Lorsqu'un utilisateur s'inscrit ou se connecte à un site web, son mot de passe est haché avant d'être stocké dans la base de données. Lors de la connexion, le mot de passe fourni est également haché et comparé au hash stocké pour vérifier son authenticité sans jamais exposer le mot de passe en clair.

#### 2️⃣ **Vérification de l'intégrité des fichiers**
Le hachage est couramment utilisé pour vérifier l'intégrité des fichiers téléchargés. Par exemple, lors du téléchargement d'un fichier depuis Internet, un hash est fourni pour le fichier. Après le téléchargement, le hash du fichier est recalculé pour vérifier qu'il n'a pas été corrompu ou modifié.

#### 3️⃣ **Signatures numériques**
Les signatures numériques reposent sur le hachage pour garantir l'intégrité et l'authenticité d'un message. Avant d'envoyer un message, une personne peut générer un hash du message et le signer avec sa clé privée. Le récepteur peut alors vérifier le message en recalculant le hash et en le comparant avec la signature à l'aide de la clé publique de l'expéditeur.

#### 4️⃣ **Détection des doublons dans les bases de données**
Le hachage est utilisé pour détecter les doublons dans des ensembles de données. Par exemple, dans une base de données de fichiers, chaque fichier peut être haché, et les doubles peuvent être détectés en comparant les hashes, ce qui permet d'optimiser l'espace de stockage.

#### 5️⃣ **Systèmes de gestion de versions (Git)**
Dans des systèmes comme **Git**, chaque commit est associé à un hash unique, permettant de vérifier l'intégrité de l'historique des versions. Le hash permet d'identifier de manière unique un état particulier du code source dans un projet.

#### 6️⃣ **Caches et indexation de données**
Les algorithmes de hachage sont utilisés pour optimiser la recherche de données dans des structures comme les caches ou les tables de hachage. Par exemple, un moteur de recherche peut utiliser le hachage pour stocker des résultats de requêtes de manière efficace, permettant une récupération plus rapide des données.

#### 7️⃣ **Blockchain et crypto-monnaies**
Les chaînes de blocs (blockchain), comme celles utilisées par les crypto-monnaies (Bitcoin, Ethereum), reposent sur le hachage pour garantir l'intégrité des transactions et des blocs. Chaque bloc contient le hash du bloc précédent, ce qui rend très difficile la modification d'un bloc sans affecter toute la chaîne.

#### 8️⃣ **Authentification des API via HMAC**
Dans les API sécurisées, l'authentification des requêtes est souvent réalisée en générant un HMAC (Hash-based Message Authentication Code) du corps de la requête, ce qui permet de garantir que la requête n'a pas été altérée et qu'elle provient bien de l'émetteur attendu.

#### 9️⃣ **Checksums de logiciels**
Les développeurs utilisent des **checksums** (comme MD5, SHA-1, ou SHA-256) pour vérifier l'intégrité des logiciels téléchargés. Avant de distribuer un logiciel, un hash du fichier est généré et partagé. Après le téléchargement, l'utilisateur peut vérifier que le hash calculé localement correspond au hash fourni pour confirmer que le fichier n’a pas été modifié ou corrompu.


### **Pourquoi c’est sécurisé ?**  
* **Car on utilise des opérations *complexes*** (rotations, XOR, modulo). Les fonctions de hachage comme SHA-256 utilisent des opérations *bitwise* (*bit à bit* manipulant directement un nombre en effectuant des opérations logiques élémentaires sur chaque bit individuellement). Ces opérations permettent de mélanger les bits de manière difficile à inverser. 


* **SHA-256 applique 64 transformations pour brouiller les données**. SHA-256 est un algorithme de hachage qui transforme un message de n'importe quelle taille en une sortie de 256 bits. Ce processus inclut 64 transformations pendant lesquelles les bits du message sont constamment mélangés. Ces transformations sont réalisées à chaque tour d'une boucle de 64 étapes, et chaque étape utilise des constantes et des résultats intermédiaires pour brouiller les données de façon non linéaire. Cela garantit que même un petit changement dans l'entrée produit une sortie complètement différente (propriété appelée "avalanche"). Ces transformations utilisent des opérations bitwise comme le XOR, les rotations et le modulo que j'ai décrites précédemment pour rendre le processus de hachage difficile à prédire et résistant aux attaques.
* **SHA-256 applique 64 transformations pour brouiller les données**. SHA-256 est un algorithme de hachage qui transforme un message de n'importe quelle taille en une sortie de 256 bits. Ce processus inclut 64 transformations pendant lesquelles les bits du message sont constamment mélangés. Ces transformations sont réalisées à chaque tour d'une boucle de 64 étapes, et chaque étape utilise des constantes et des résultats intermédiaires pour brouiller les données de façon non linéaire. Cela garantit que même un petit changement dans l'entrée produit une sortie complètement différente (propriété appelée **avalanche** ci-dessus). Ces transformations utilisent des opérations *bitwise* comme le `XOR`, les rotations et le `modulo` pour rendre le processus de hachage difficile à prédire et résistant aux attaques.


* **les fonctions de *hash* comme `bcrypt` ajoutent un "sel" aléatoire** pour empêcher les attaques par rainbow table. Un "sel" (ou salt en anglais) est une donnée aléatoire ajoutée au mot de passe avant qu'il ne soit haché. Cela empêche les attaques par rainbow table, qui sont une méthode pour casser les hachages en pré-calculant des correspondances entre des mots de passe courants et leurs hachages. Le "sel" rend chaque hachage unique, même si deux utilisateurs ont le même mot de passe. Cela complique énormément l'usage des rainbow tables, car il faudrait recalculer les tables pour chaque possible "sel", ce qui est peu pratique.
* **les fonctions de *hash* comme `bcrypt` ajoutent un *sel* aléatoire** pour empêcher les attaques par rainbow table. Un *sel* (ou *salt* en anglais) est une donnée aléatoire ajoutée au mot de passe avant qu'il ne soit haché. Cela empêche les attaques par rainbow table, qui sont une méthode pour casser les hachages en pré-calculant des correspondances entre des mots de passe courants et leurs hachages. Le *sel* rend chaque hachage unique, même si deux utilisateurs ont le même mot de passe. Cela complique énormément l'usage des rainbow tables, car il faudrait recalculer les tables pour chaque possible *sel*, ce qui est peu pratique.


* **Bcrypt utilise un processus de hachage itératif**, où le mot de passe et le "sel" sont hachés plusieurs fois, ce qui rend l'attaque par brute force beaucoup plus lente et difficile à réussir.
* **Bcrypt utilise un processus de hachage itératif**, où le mot de passe et le *sel* sont hachés plusieurs fois, ce qui rend l'attaque par brute force beaucoup plus lente et difficile à réussir.


* **Les fonctions de hachage utilisent des facteurs de coût**. Si on ne connait pas le mot de passe et qu'on souhaite tenter une attaque en force brute, le facteur de coût est exponentiel. Par exemple, `bcrypt` utilise un facteur de coût (souvent exprimé par un nombre comme 10, 12, 14, etc.), qui définit combien de fois l'algorithme doit être exécuté. Ce facteur est exponentiel, c'est-à-dire que pour chaque augmentation du facteur, le temps de calcul augmente de façon exponentielle. Par exemple, avec un facteur de coût de 10, bcrypt effectue 2^10 itérations. Avec un facteur de coût de 12, il effectue 2^12 itérations, et ainsi de suite. Cela rend l'attaque par force brute beaucoup plus lente.