À vous de jouer !
Votre manager vous demande ce matin de reprendre le travail d’un ancien collègue, qui avait cherché à mettre en place une application de gestion de mots de passe, à l’échelle de l’entreprise. L’application avait pour objectifs :
de stocker un mot de passe ;
de vérifier si un mot de passe est correct ;
et de changer de mot de passe.
Vous avez seulement les quelques notes de votre ancien collègue sur le premier prototype qu’il avait fait, et vous allez devoir aujourd’hui modifier le code.
Voici ces quelques notes :
Objet du prototype : Application en PHP avec la librairie Libosdium
Caractéristique du prototype : Stockage en mémoire dans l’application (pas de stockage persistant)
Description des différentes fonctions :
La fonction stocker_mot_de_passe permet de stocker le mot de passe. Pour cela, on utilise d'abord une fonction de hachage de mot de passe. On chiffre ensuite le haché avec une clé secrète. Puis on stocke le texte chiffré dans la variable globale $mot_de_passe_stocke. Le code de cette fonction est opérationnel.
La fonction verifier_mot_de_passe vérifie qu'un mot de passe fourni en paramètre correspond bien au mot de passe stocké. Si la vérification est réussie, la fonction renvoie "vrai", sinon elle renvoie "faux". Si aucun mot de passe n'a encore été stocké, la fonction doit renvoyer "faux". Le code de cette fonction n’est pas opérationnel.
La fonction test_verifier_mot_de_passe permet de tester si un mot de passe est vérifié ou pas. Elle affiche un message “mot de passe valide / invalide” selon le résultat de la fonction verifier_mot_de_passe. Le code de cette fonction est opérationnel.
La fonction changer_mot_de_passe permet de changer le mot de passe stocké. Elle fonctionne de la même manière que la fonction stocker_mot_de_passe avec une différence : le nouveau mot de passe ne doit pas être égal à l'ancien mot de passe suivi d'un seul caractère. Par exemple, si l'ancien mot de passe est "velo", le nouveau mot de passe ne peut pas être "velo1" ni "veloa" ; en revanche il peut être "Velo" ou "velo01". Bien sûr, l'ancien mot de passe n'est pas stocké en mémoire, il vous faut donc trouver un moyen de vérifier cela simplement avec le haché de l'ancien mot de passe. Si le mot de passe est bien changé, la fonction affiche "changement de mot de passe valide" ; sinon, elle affiche "erreur, le nouveau mot de passe est trop proche de l ancien". Le code de cette fonction n’est pas opérationnel.
Au-delà de ses notes, vous avez heureusement le code PHP de son prototype. Vous allez devoir faire en sorte que le code des différentes fonctions soit opérationnel (et donc écrire les codes des deux fonctions non opérationnelles !)
Téléchargez le code php du prototype de votre collègue et effectuez les modifications nécessaires.
Vérifiez bien que vous avez modifié les fonctions non opérationnelles pour faire en sorte que l'application remplisse ses objectifs, qui sont :
de stocker un mot de passe ;
de vérifier si un mot de passe est correct ;
et de changer de mot de passe.
Vérifiez votre travail
Alors, vous êtes allé au bout ? Suivez le guide pour vérifier votre travail !
Pour corriger votre travail, vous devez effectuer l’ensemble de ces vérifications :
Vous devez exécuter le fichier authentification.php fourni par l'étudiant en ligne de commande, avec la commande
php -f [NomDuFichier.php]
Le programme doit s'exécuter sans erreur et afficher les messages suivants (avec des variations éventuelles) :
mot de passe valide
mot de passe invalide
changement de mot de passe valide
mot de passe valide
erreur, le nouveau mot de passe est trop proche de l'ancien
La fonction verifier_mot_de_passe doit :
tester si le mot de passe stocké est vide, et renvoyer "faux" dans ce cas ;
déchiffrer le haché du mot de passe stocké avec la fonction sodium_crypto_secretbox_open
vérifier si le mot de passe fourni correspond au mot de passe stocké avec la fonction sodium_crypto_pwhash_str_verify
renvoyer "vrai" si le mot de passe fourni correspond, ou bien renvoyer "faux".
La fonction changer_mot_de_passe doit :
enlever le dernier caractère du nouveau mot de passe, par exemple avec la fonction substr($mot_de_passe_fourni, 0, - 1)
vérifier que le nouveau mot de passe sans le dernier caractère ne corresponde pas au mot de passe stocké, par exemple en appelant la fonction verifier_mot_de_passe
afficher "erreur, le nouveau mot de passe est trop proche de l ancien" si c'est le cas
sinon, stocker le nouveau mot de passe complet, par exemple en appelant la fonction stocker_mot_de_passe, puis afficher "changement de mot de passe valide".