JeuWeb - Crée ton jeu par navigateur

Version complète : Le hashage et le salage pour les débutants
Vous consultez actuellement la version basse qualité d’un document. Voir la version complète avec le bon formatage.
Bonjour à tous,
Je fais un topic sur le hashage et le salage pour les débutants, afin de bien expliquer l'intérêt des deux techniques. Je me base sur PHP pour ce cours de cuisine Confusediffle:
N'hésitez pas à commenter et à apporter vos corrections/ajouts

Le hash
C'est LE truc hyper important !

Le hash, c'est quoi ?
Le hash est une fonction mathématique qui calcule une emprunte, d'un nombre de caractères défini, de l'information que vous lui fournissez (que ce soit une chaîne de caractères ou autre).

Deux particularités importantes :
- Si vous fournissez la même donnée à la même fonction de hash, l'empreinte sera toujours identique
- Il est irréversible : il est impossible de déterminer la donnée initiale à partir d'un hash autrement qu'en la devinant (à quelques exceptions près).

A quoi ça sert ?
Principalement à la sécurisation de mots de passe. Lorsque l'utilisateur s'inscrit, vous ne stockez pas son mot de passe mais le hash de celui-ci. Ensuite, lorsqu'il souhaite se connecter, vous faites un hash du mot de passe soumis, et vérifiez qu'il correspond bien à celui enregistré. Ainsi, si un pirate a accès à votre base de donnée, il ne pourra pas obtenir les mots de passe de vos utilisateurs, qui sont hashés, donc inexploitables.

Quels avantages ?
C'est très utile pour des informations que l'utilisateur doit fournir. C'est en outre plus simple et plus sûr qu'un chiffrement, car vous n'avez pas de clé à stocker.
L'inconvénient est qu'un hash est inexploitable autrement qu'en le comparant à un autre; vous ne pourrez pas, par exemple, stocker le score du joueur avec un hash car il est impossible de le décrypter ensuite.

Quels risques ?
Tout dépend de la technologie.
Les hash, c'est une sorte de course à la puissance. Les algorithmes de hash sont volontairement conçus pour être lents : ils sont suffisamment rapides pour ne pas impacter un serveur qui hash le mot de passe de son utilisateur, mais suffisamment lent pour rendre impossible le déchiffrage par force brute.
Le déchiffrage par force brute consiste à tester toutes les combinaisons possibles, à les hasher, et à regarder si elles correspondent au hash que l'on souhaite casser. Cela prend du temps, car il est nécessaire de calculer des centaines de millions de hash. Les algorithmes étant volontairement lents, cela peut prendre plusieurs siècles; on considère ainsi que le hash est inviolable.
Cependant, ce principe devient caduque lorsque la puissance des machines augmente, et donc que le temps mis à faire un hash diminue considérablement. On passe donc à un algorithme mieux adapté à la capacité des machines du moment.

En outre, il existe le phénomène de collision : en gros, ça consiste à trouver deux hash identiques qui proviennent pourtant de deux entrées différentes. A partir d'une collision, il est possible de casser l'algorithme et de déchiffrer les hash plus simplement. Cela reste toutefois rare, mais on considère un algorithme comme obsolète lorsqu'une ou plusieurs collisions ont été faites.

Il y a deux algorithmes très connus : le md5 et le sha-1. Le md5 est obsolète : il existe de nombreuses bases de données sur le web qui donnent la chaîne de départ d'un md5 donné. En outre, plusieurs collisions ont été faites.
On utilise donc le sha-1, qui calcule une empreinte de 40 caractères alphanumériques.
Dans php, il s'utilise de la façon suivante :
Code :
<?php
$pass="monmotdepasse";
$hash_a_stocker_dans_la_db=sha1($pass);
echo $hash_a_stocker_dans_la_db;
?>

Le salage
Le salage est quelque chose d'assez peu répandu sur les jeux amateurs et qui est pourtant primordial.

Deux cas de figure important :
- Les utilisateurs ont souvent tendance à utiliser des mots du langage courant comme mot de passe, ou des prénoms, etc. Les pirates ont donc des dictionnaires de mots, et les hash qui leurs correspondent. En quelques secondes, il est ainsi possible de casser le hash d'un mot de passe trop simple.
- Calculer des hash à la chaîne prend du temps (voir plus haut). Les pirates calculent donc des dictionnaires de chaînes aléatoires et de leurs hash, puis recherchent les hash qu'ils ont volé dedans pour trouver le mot de passe.

Le salage permet de lutter contre ces deux cas de figure et de considérablement renforcer la sécurité de vos hash.

Salage fixe
L'idée est de concaténer une chaîne de caractère connue au mot de passe, avant de le hasher. Par exemple :
Code :
<?php
$pass="monmotdepasse";
$salt="monsalage";
$pass_a_hasher=$pass.$salt;
//Là, $pass a hasher="monmotdepassemonsalage"
$hash=sha1($pass_a_hasher);
echo $hash;
?>
Etant donné que vous connaissez la chaîne utilisée pour le salage, lorsque l'utilisateur veut se connecter, vous devrez concaténer cette chaîne avec le mot de passe fourni, le hasher, et le comparer avec la base de données.

L'intérêt est simple : l'introduction d'une chaîne de salage changera tous les hash. Cela veut dire que le pirate doit recalculer ses dictionnaires en incluant votre chaîne de salage, ce qui prend du temps et limite l'intérêt du dictionnaire.

Le salage dynamique
Encore mieux : le salage dynamique consiste à déterminer une chaîne de salage différente pour chaque utilisateur.
Lorsque l'utilisateur s'inscrit, vous générez une chaîne de caractères aléatoire que vous enregistrez avec son pseudo dans votre base de donnée. Vous salez le mot de passe avec et le hashez (miam).
Lorsqu'il voudra se connecter, il faudra récupérer la chaîne de salage dans la base de donnée, saler le mot de passe fourni, le hasher et le comparer avec le hash stocké.
L'intérêt : si avec un salage fixe, le pirate doit recalculer tous ses dictionnaires pour casser vos mots de passe les plus simples, ici, deux mots de passe identique de deux utilisateurs différents n'auront pas le même hash, car ils ont un salage différent. Ainsi, le pirate doit recalculer tous ses dictionnaires pour chaque utilisateur ce qui empêche tout casse massif des mots de passe que vous stockez.
La chaîne de salage peut être stockée en clair (sans chiffrement), car ce n'est pas le secret de celle ci qui nous intéresse, mais son impact sur le temps de calcul pour un pirate tentant de deviner le mot de passe par la force Smile

Conclusion
Le hash est absolument nécessaire pour stocker les mots de passe. Il est en outre préférable de le saler, au moins avec un salage fixe, afin de mieux protéger les utilisateurs ayant choisi un mot de passe faible.
Pour stocker des données qu'il est nécessaire de pouvoir récupérer par la suite (comme des réponses à une question secrète), le chiffrement peut être nécessaire. Mais il est moins sûr car si quelqu'un a accès à votre source, et donc au code de chiffrement, les données chiffrées ne sont plus protégées.

Bref, le hash c'est bien, mangez en, en plus il est midi :roi:
Voilà, merci à tous Smile
Deja vu: http://www.jeuweb.org/showthread.php?tid=7363

(et ton nommage de variable est infect ...)
(et tu peux hasher sans probleme du "Je suis super hérétique" donc pas besoin de "nettoyer" ta chaine de caractère pour ta réponse secrète ce qui la rend bien moins sécurisée)
Ok ben j'ignorais, tant pis. Quant au nommage des variables c'est du speed, je suis au courant que c'est moche. Et pour la réponse secrète, un mot de passe ça s'apprend par coeur, une question secrète pas forcément, la méthode permet de tolérer des approximations syntaxiques que l'utilisateur est tout à fait capable de faire sans pour autant compromettre la sécurité. Enfin bref.
Tu compromets la sécurité en évitant des signes de ponctuations compliqués. C'est comme dire qu'un mot de passe qui est "Le[!123?.)) 3F" deviendrait "le1233F" pour le premier il faudrait 4.4 billion d'années en force brute pour être décrypter et le seconde 14 mintues Smile
De plus, il est prouvé que 80% des utilisateurs n'utilisent pas une réponse cohérente à la question posée, en gros, tu peux te retrouver avec une question qui a pour réponse "[&"'(§!)]!1" qui deviendrait "1" avec ta méthode au final, c'est pas courant mais c'est probable !

Source: https://howsecureismypassword.net/
Hmm oui j'avais pas pensé au fait que les users puissent mettre n'importe quoi et surtout quelque chose d'incohérent. Donc je vais corriger ça Smile
Pour aller plus loin, les limites de la méthode que tu exposes, et une solution (temporaire) : http://30minparjour.la-bnbox.fr/2013/sec...-et-bcrypt
Intéressant, je ne connaissait pas bien blowfish ^^