Le hachage, une mesure de second rideau
En quoi cela sécurise? (5 minutes)
https://fr.wikipedia.org/wiki/Fonction_à_sens_unique
Après avoir lu, la page wikipedia, par équipe de 4, faites une phrase qui explique en quoi cela sécurise le mot de passe?
Pour quoi ça s'utilise
- On n'a pas besoin de l'information fournie pour l'application
- On a juste besoin de vérifier que c'est la même info que celle fournie à l'inscription
Comment ça s'implante en code
⚠️ Ne jamais implanter une fonction de crypto soi-même: On n'a pas encore le niveau!
https://learn.microsoft.com/en-us/dotnet/api/system.security.cryptography.hashalgorithm?view=net-8.0
L'algorithme le plus classique pour nous SHA256:
- l'implantation renvoit souvent le hash sous forme de byte[]
- on peut ensuite le convertir en string pour le stocker dans la BD en base64
- une petite rechercher sur comment on convertit un byte[] en string en base64 devrait suffire
Activité Attends une minute, c'est quoi l'avantage de SHA256 sur MD5
- prends quelques mots de passe simples et produis les hashs avec MD5 et SHA256 (tu trouveras un site web pour le faire)
- prends quelques mots de passe plus complexes et produit les hashs avec MD5 et SHA256
- essaie ensuite de voir quels hashs tu peux retrouver avec crackstation
- vois-tu une différence selon l'algorithme de hash?
- si je devine le mot de passe comme pour bob dans le TP2, est-ce que l'algorithme de hash change quelque chose?
la grosse question, contre quelles attaques nous protège le changement de md5 vers SHA256
- crackstation : nope, ils ont aussi les hashs pour tous les algos de hash classique, ça ne change rien
- devine le mot de passe en connaissant des infos persos : non plus, le mot de passe reste le même, juste le hash qui change
Alors donc:
- les hash sont plus longs donc la probabilité d'une collision (2 mots de passe qui donne le même hash est plus faible)
- c'est pas tant différent
Est-ce qu'on veut saler notre mot de passe?
Pour rappel, saler un mot de passe c'est:
- concaténer le mot de passe fourni par l'utilisateur avec une chaîne si possible complexe
- ensuite on hash
- ensuite on stocke dans la BD
- si le sel est spécifique à chaque utilisateur, il faudra alors le stocker dans la BD également
bcrypt, le standard de l'industrie et pourquoi
- bcrypt ajoute un salt tout seul sur BlowFish
- PROTECTION CONTRE un mot de passe utilisateur simple
- bcrypt s'adapte aux resources de calcul qui augmente et peut devenir de plus en plus dur à calculer
- PROTECTION CONTRE une attaque en force brute où on calcule plein de hash > ça devient impossiblement long
Wow wow, comment ça il ajoute automatiquement un hash?
- en fait on tire au hasard un salt, on calcule un hash
- on stocke en clair le salt dans le résultat avec le hash
22 character salt (en clair) and 31 character hash
- quand on veut comparer plus tard, on peut recalculer puisqu'on a le salt en clair
Explication de comment BCrypt marche bcrypt
https://www.youtube.com/watch?v=O6cmuiTBZVs
Pour le reste du cours
Travailler à implanter Bcrypt dans l'application fournie. Vous devrez sans doute:
- chercher une librairie qui implante bcrypt
- ajouter un paquet nuget dans votre solution
- changer le code pour utiliser la librairie
Pour toutes ces étapes, essayez de le faire seul. Par contre, n'oubliez que le prof est toujours là pour débloquer les situations.
Aussi : utilisation de hash pour détecter une attaque
- Bob qui développe une page web utilise un CDN pour charger jquery 1.8
- il ajoute donc une balise **"
- il a un peu peur qu'un jour quelqu'un pirate le site supercdn.com et modifie le code de jquery.min.js pour faire des trucs
- arrive alors l'attribut integrity
- on y met le hash du code source correct
- si un jour le navigateur télécharge le fichier calcule le hash et voit qu'il ne correspond pas, il n'exécute pas le code
Dans ce cas, une attaque devient beaucoup plus compliquée:
- le pirate doit prendre le contrôle du site supercdn
- le pirate doit effectuer une modification qui:
- fait le truc méchant voulu en étant du javascript valide
- donne le même hash que le code d'origine
ici se trouve la grande fragilité de MD5:
- on n'a pas d'attaque de type préimage sur MD5, c'est à dire qu'on ne sait pas facilement trouver une string qui donne un hash donné
- par contre, il y a des attaques qui permettent de padder un fichier pour qu'il donne le même hash donc:
- je peux modifier le fichier jquery.min.js pour faire un truc vraiment pas cool
- ajouter un début de commentaire puis créer une string dans le commentaire qui va faire que ça donnera le même hash
- le navigateur va télécharger le fichier, calculer le hash et voir que c'est bon
- et le pirate a réussi à injecter un fichier js malicieux sans être détecté
MORALITÉ: ne jamais utiliser MD5 pour des hash de sécurité, ce qui s'est traduit par ne jamais utiliser MD5