Ne confondons pas (fonction de hachage et de chiffrement) !

Fonction de hachage et fonction de chiffrement.

C’est une erreur commune de croire que md5, sha1 et ses équivalents plus solides, sont des fonction de chiffrement. En effet, lorsque les mots de passe ne sont pas stockés en clair, il le sont souvent sous la forme d’un condensat (hash), et ce en se basant sur la propriété suivante : la fonction de hachage est une fonction à sens unique.

A partir du mot de passe, on peut obtenir le hash, mais pas l’inverse (les collisions c’est une autre histoire 😉 ). Donc, si un attaquant obtient le hash, il ne pourra rien faire avec, puisque ce n’est pas le mot de passe !

Et là c’est le drame…

En effet, bien qu’en théorie on ne puisse retrouver de façon formelle le mot de passe à partir du hash, il est toujours possible d’effectuer une attaque par force brute à l’aide d’un outil comme John The Ripper.

En essayant toutes les combinaisons possibles de mots de passes et en passant ces combinaisons dans la fonction de hachage approprié, l’attaquant peut retrouver le mot de passe !!!

« Mais alors, pourquoi n’utilise-t-on pas de fonction de chiffrement !!! » me direz vous…

  1. la crypto c’est compliqué : forcément, quand pour vous enseigner l’usage de la cryptographie, on vous bassine avec la théorie mathématique qui en est à l’origine… ça ne donne pas envie.
  2. la crypto c’est lent : quand on doit traiter plusieurs milliers d’opérations de login, on veut des fonctions rapides, et les fonctions de hachage sont bien plus rapides que celles de chiffrement.
  3. on a toujours fait ainsi : sur bien des systèmes, les mots de passe ont toujours été stockés sous forme de condensat, car à l’époque on avait pas la puissance nécessaire pour bruteforcer le hash. C’etait bien suffisant.

Sauf que les temps ont changé… mais pas les habitudes.

La solution : mettez y un peu de SEL.

Lorsque vous souhaitez stocker le mot de passe d’un utilisateur, utilisez la fonction de hash comme ceci : hash(« mot-de-passe » + « sel »)

Si jamais un attaquant tombe sur un hash, et qu’il le casse, il se retrouvera alors avec une chaine qui sera la concaténation du mot de passe et du sel ce qui allongera la durée nécessaire au cassage du mot de passe, et ajoutera de la complexité au mot de passe lui même, rendant bien plus longue sa découverte.