Stocker des mots de passe sécurisés avec PHP
Stocker des mots de passe sécurisés avec PHP
-
Objectifs
- Être capable de stocker des mots de passe utilisateur en base de données de manière sécurisée dans le cadre d’une application web.
-
Présentation
- La gestion des mots de passe est un problème courant : il faut en effet savoir stocker correctement les mots de passe des utilisateurs de votre système, en plus de gérer ceux de votre application.
- Le hashage de mot de passe est l’une des pratiques de sécurité les plus basiques qui doit être effectuée. Sans cela, chaque mot de passe stocké peut être volé si le support de stockage (typiquement une base de données) est compromis.
-
Pourquoi
- Il ne faut jamais stocker les mots de passe en clair. En effet, dans l’éventualité où vous vous feriez pirater votre base de données, le hacker aura accès à tous les identifiants et mots de passe de vos utilisateurs.
- Le fait de stocker des mots de passe en clair compromet la sécurité des comptes que vos utilisateurs ont sur d’autres sites s’ils ont utilisé les mêmes identifiants.
- Une autre solution consiste à hacher le mot de passe à l’aide d’une fonction de hachage à sens unique, telle que
md5()
ousha1()
. - Mais aussi cette solution est mauvaise, pourquoi ? parce que, ce que font les hackers, ce n’est pas tenter de retrouver un mot de passe à partir d’un hash. Ils vont tout simplement hacher une liste de mots de passe possibles et comparer les hash de ces mots de passe aux hash trouvés dans la base de données. S’il y en a un qui correspond, c’est qu’ils ont trouvé un mot de passe
- À partir d’une base de données contenant des mots de passe hachés avec SHA1, un hacker est susceptible de récupérer 60 % des mots de passe en moins de 24 heures. selon la source suivante:source« >selon la source suivante
-
Hacher un mot de passe avec la nouvelle API
- A partir du moment où vous avez un mot de passer à hacher, il suffit d’un seul appel de fonction :
- La fonction
password_hash()
crée un nouveau hachage en utilisant un algorithme de hachage fort et irréversible. La fonctionpassword_hash()
est compatible avec la fonctioncrypt()
. Aussi, un mot de passe haché par lafonction crypt()
peut être utilisé avec la fonctionpassword_hash()
. -
Application
- Créez un nouveau fichier inscriptionUtilisateur.php qui propose un formulaire d’inscription pour un nouvel utilisateur et le soumet à la même page.
- Le nouveau ficher contient un formulaire avec quatre champs nom complet, adresse mail , mot de passe et confirmation du mot de passe.
- Utilisez les fonctions javascript pour contrôler et sécuriser votre formulaire
- Écrivez un nouveau fichier crypterpwd.php qui effectue les traitements suivants:
- il vérifie que la méthode utilisée pour l’appeller est POST
- il vérifie et sécurise les champs du formulaire de connexion
- il tente d’insérer le nouvel utilisateur:
- Pour plus de navigabilité, affichez un lien pour s’inscrire sur le formulaire et, inversement, un lien pour se connecter sur connexion.
- Modifiez le fichier crypterpwd.php afin qu’il enregistre le mot de passe chiffré avec la fonction PHP
password_hash
.- Ajoutez une fonction dans le fichier crypterpwd.php pour qu’il compare le mot de passe du formulaire avec celui récupéré dans le BDD à l’aide de la fonction PHP
password_verify()
.- Ajoutez une troisième fonction dans le fichier crypterpwd.php pour qu’il compare l’adresse email du formulaire avec celui récupéré dans le BDD à si c’est le cas l’utilisateur ne peut s’enregistrer.
- Ci-dessous, vous pouvez trouver un exemple qui montre comment stocker un mot de passe en base de données et vérifier la validité de ce dernier en PHP.
- Traitement de mot de passe oublié
- Ajoutez une colonne char(13) dans ta table utilisateur qui permettra de stocker le jeton de réinitialisation du mot de passe
- Créez un formulaire "mot de passe oublié" avec un champ pour l’adresse email
- Créez une page de traitement de ce formulaire qui inscrit un uniqid() dans la colonne crée en 1 pour l’utilisateur correspondant à l’email et qui envoi un mail à l’utilisateur avec un lien contenant le jeton : http://adressdusite/reinitialisation.php?…=4b3403665fea6
- Créez un formulaire qui demande un nouveau mot de passe (notre reinitialisation.php du point 3) ; le formulaire doit retransmettre également le token et l’email qui ont été reçus par le lien.
- Créez une page de traitement du formulaire 4 : si le token et l’email correspondent aux informations dans la base de donnée, on met à jour le mot de passe et on efface le token de la colonne pour cet utilisateur.
La première chose qu'on apprend en sécurité, c'est qu'il ne faut JAMAIS faire confiance au client. Les données malicieuses, intentionnelles ou non, viennent dans 99% des cas du client
$password = '@z179W§m';
$hash = password_hash($password, PASSWORD_DEFAULT);
var_dump($hash);