JeuWeb - Crée ton jeu par navigateur
Mots de passe et salt : explications - Version imprimable

+- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org)
+-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38)
+--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51)
+--- Sujet : Mots de passe et salt : explications (/showthread.php?tid=5184)

Pages : 1 2 3


Mots de passe et salt : explications - Viciousity - 20-01-2011

La sécurité par le "Salt".

1. Explications.

Le "Salt" est une méthode qui est utilisée de plus en plus dans la programmation pour sécuriser des données.
Cette méthode repose sur un principe simple: Chaque compte est unique et possède donc une clé et un hash unique.
On est tous un grain de sable dans un immense sablier et chaque grain est unique par sa composition.
Cela permet une sécurité accrue car même si une personne mal-intentionnée réussi a récupérer les infos de votre base de données et de trouver l'algorithme pour passez outre un mot de passe, elle ne pourra le faire que pour un seul compte.
Cette méthode permet donc de "Perdre" le mot de passe d'origine, ainsi, on ne peut, a moins d'être un hacker plus que pro, retrouver votre mot de passe réel.
On parle donc de HASH et plus de cryptage.

2. Prérequis à la mise en place.

Pour mettre en place cette méthode, vous avez besoin de:
  1. 1 base de donnée
  2. 1 table pour stocker vos comptes dans celle-ci
  3. 3 champs respectivement: username, password_salt, password_hash

3. On se lance.
A. Création du compte.

/*
Dans le script ci-dessous imaginons qu'un formulaire d'inscription a été soumis avec comme données:
@ $_POST['username']
@ $_POST['password']
*/


/* HASH: Perdre l'information.
===========================
Cette méthode va permettre de perdre une information en créant une nouvelle.
---------------------------------------------------------------------------------------------*/
function hash_string(string1,string2){ hash('sha256',"'.$string1.'::'.$string2.'"); }

/* SECURISATION: Crée les nouvelles données protégées.
===================================================
On crée le "salt" unique en utilisant un facteur aléatoire.
Utilisons donc quelque chose qui une fois écoulé ne peut plus se
reproduire: le temps.
---------------------------------------------------------------------------------------------*/
$password_salt = hash_string(time(),$_POST['password']); // Unique grâce à time().
$password_hash = hash_string($password_salt,$_POST['password']); // Unique grâce au salt.

$new_account = "INSERT INTO accounts (username,password_hash,password_salt) VALUES('$_POST['username']','$password_hash','$password_salt')";
mysql_query($new_account);

B. Récupération des infos.

/*
Dans le script ci-dessous imaginons qu'un formulaire a été soumis avec comme donnée:
@ $_POST['username']
@ $_POST['password']
*/


/* QUI: Retrouver le compte que l'on doit connecter.
=================================================
Pour que la méthode marche, nous avons besoin du salt et du hash afin de comparer les
données et ainsi vérifier si elles sont correctes.
---------------------------------------------------------------------------------------------*/
$select_user = mysql_query("SELECT password_hash,password_salt FROM accounts WHERE username='$_POST['username']'");
$account = mysql_fetch_array($select_user);


/* COMPARAISON: Vérifier si le mot de passe correspond.
====================================================
Nous allons maintenant vérifier si le mot de passe correspond au hash stocké dans la
base de données. Nous avons donc besoin de la même fonction hash_string() que celle de
l'inscription.
---------------------------------------------------------------------------------------------*/
function hash_string(string1,string2){ hash('sha256',"'.$string1.'::'.$string2.'"); }

if(!empty($account) && isset($account) && $account['password_hash'] == hash_string($account['password_salt'],$_POST['password'])){
/* Les lignes ci-dessus sont les plus importantes.
En effet, vous pouvez remarquer que l'on ne cherche pas a décrypter mais à comparer le hash
du mot de passe soumis avec le salt du compte concerné pour voir si il correspond au HASH du compte.
Ainsi, en aucun cas on ne réutilise le mot de passe brut du compte.
On agit donc par comparaison et non plus par décryptage */
} else {
// Mauvais mot de passe.
}


4. Conclusion.

Cette méthode est vraiment très simple a mettre en place et vous permettra d'avoir une sécurité maximale pour vos utilisateurs.
Alors n'hésitez pas a mettre votre "grain de sel" pour ennuyer les personnes malveillantes Big Grin


PS: Le script est a titre informatif, il faut donc l'implanter et non simplement le copier. En efftet, il ne prend pas en compte le "Never trust user input". De plus ayant l'habitude de travailler avec un ORM et en orienté objet, les méthodes d'insertions et de récupération de données sont plus que douteuse ;P


En espérant vous avoir aidé, Viciousity.

Un grand merci a anthor pour le hash('sha256',"");


RE: SALT: explication. - Kihmé - 20-01-2011

merci beaucoup, très sympa ce genre de ressources


RE: SALT: explication. - Anthor - 20-01-2011

On confond moins hashage et cryptage, mais pourquoi nommer une fonction de hashage par un nom de cryptage ?!

Sinon a partir de PHP 5.1.2 :

hash('sha256', $password_hash);



RE: SALT: explication. - Ter Rowan - 20-01-2011

c'est quand même hash-ement plus propre que le précédent, merci !

effectivement le nom encrypt pour du hash me perturbait un peu mais peu importe par contre je pense qu'il est intéressant de modifier le code pour tenir compte de la fonction présentée par anthor


de plus pour tous ce genre de sujet, je pense qu'on devrait systématiquement appeler une fonction/méthode de sécurisation, quitte à appeler une fonction non définie pour sécuriser le contenu (au lieu d'utiliser $_POST en disant qu'il ne faut pas faire comme ça)

Ca permettrait ainsi d'éviter que certains utilisent le code sans connaitre les failles.


d'un point de vue discipline c'est limite moins compliqué (écrire SafeText( $_POST['toto'] ) ou un autre nom plus parlant est assez simple :p )


RE: SALT: explication. - Argorate - 20-01-2011

Cependant je reste sur mon idée que c'est du gâchis de stocker en bdd un très grand nombre de caractère pour le salt qui multiplié par des milliers de joueur potentiels remplit et alourdi la bdd pour rien, autant utiliser des données unique a chaque membre mais déjà présente en bdd (pseudo, time de dernier connexion, date d'anniversaire ou que sais-je d'autre...)

Mais bon ça c'est de l'optimisation, le principe est le même.


RE: SALT: explication. - nicodd - 20-01-2011

Sauf que toutes ces données là sont amenées à changer, donc tu ne pourra plus connecter ton joueur lorsqu'il change de pseudo, lorsqu'il se connecte (j'espère que tu vois toute l'ironie de la chose), ou décide pour une raison quelconque de changer sa date de naissance.


RE: SALT: explication. - Viciousity - 20-01-2011

Voila, merci a anthor pour ses remarques, j'ai donc modifié le code en conséquence Smile

Et nicodd vient de répondre a ta question Argorate Smile
Surtout que je ne pense pas que un SEUL champ en plus alourdisse énormément ta base de données ;P


RE: SALT: explication. - Argorate - 20-01-2011

Si tu prends une donner modifiable, il suffit de faire la rectification s'il change de pseudo ou de date de naissance. Maintenant j'ai dis ça parce qu'en général ça ne change pas... Effectivement c'est s'embêter la vie pour rien mais bon. ^^

EDIT: Viciousity : dans ton exemple tu prend le time() + autre chose, ça fait beaucoup de caractères, sur des jeux qui ont du succès à 50 000 joueurs, ça en fait quelqu'un d'octet quand même Big Grin


RE: SALT: explication. - Holy - 20-01-2011

(20-01-2011, 05:01 PM)nicodd a écrit : Sauf que toutes ces données là sont amenées à changer, donc tu ne pourra plus connecter ton joueur lorsqu'il change de pseudo, lorsqu'il se connecte (j'espère que tu vois toute l'ironie de la chose), ou décide pour une raison quelconque de changer sa date de naissance.
N'empêche qu'y a quand même des données qui changent jamais, comme la date d'inscription par exemple.


RE: SALT: explication. - Anthor - 20-01-2011

(20-01-2011, 05:15 PM)Argorate a écrit : Si tu prends une donner modifiable, il suffit de faire la rectification s'il change de pseudo ou de date de naissance.

Ah et tu modifies comment ton pass hashé que tu ne connais pas ?