Décrypter un champ en MD5 [Résolu/Fermé]

Signaler
Messages postés
403
Date d'inscription
mercredi 7 décembre 2011
Statut
Membre
Dernière intervention
9 mai 2018
-
Messages postés
403
Date d'inscription
mercredi 7 décembre 2011
Statut
Membre
Dernière intervention
9 mai 2018
-
Bonjour,

Voilà je suis entrain de développer une application pour ma section de BTS, et j'ai un petit souci sur ma fonction mot de passe oublié (pour l'authentification). Au final, le type qui a oublié son mot de passe entre son login et un mail contenant son mot de passe lui est envoyé sur son adresse liée à son compte. Mais je n'en suis pas rendu a a ce point là. Actuellement j'arrive à récupérer le mail et le mot de passe mais il est crypté en MD5 et lors de mes tests forcément j'affiche le MDP crypté... Donc existe-il une fonction qui permet de décrypté et de m'afficher le mot de passe normalement ?

Merci de bien vouloir m'aider :)

Voici le code actuel :
 $login=(isset($_POST['login'])) ? $_POST['login'] : "";


 if (isset($_POST['login']))
  {
   try {
   include("../connexion.php");
   $req="SELECT DISTINCT  mail, password FROM users_profs WHERE login='".$login."'";
   $res = $connect->query($req);
   var_dump($req);

   //Traitement du résultat
   while($row=$res->fetch(PDO::FETCH_ASSOC))
    {
     $mail='"'.$row['mail'].'"';
     $password='"'.$row['password'].'"';
    }
    echo $mail;
    echo $password;
   } catch (PDOException $e) {
       echo 'Echec de la connexion : ' . $e->getMessage();
       exit;
   }
  }
 else 
  {
    echo '<body onLoad="alert(\'aucun utilisateur a été rentré...\')">';
    echo '<meta http-equiv="refresh" content="0;URL=../log/forgotten-passwd.php">';
  }


Tobi.
"Trois savoirs gouvernent le monde : le savoir, le savoir-vivre et le savoir-faire,
Mais le dernier souvent tient lieu des deux autres."
A voir également:

6 réponses


Bonjour

Si tu n'as pas d'autre trace du mot de passe original que sa signature MD5 dans ta base, tu ne peux pas retrouver le mot de passe : c'est aussi simple que ça.
Mais ce n'est pas grave. Dans ce genre de cas, tu génères un mot de passe aléatoire que tu envoies à l'utilisateur distrait, et toi tu gardes la signature MD5 dans ta base pour futures vérifications. Si ton interface le permet, il pourra ensuite mettre un mot de passe à sa convenance, sinon tant pis pour lui, il faudra bien qu'il vive avec celui que tu lui auras fourni.
2
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 65492 internautes nous ont dit merci ce mois-ci

Messages postés
403
Date d'inscription
mercredi 7 décembre 2011
Statut
Membre
Dernière intervention
9 mai 2018
56
Merci de votre réponse ! Mais cela ne m'arrange pas vraiment.... Mais bon tant pis je vais devoir faire avec. Pour le moment mon interface n'est pas codée en intégralité donc c'est pas un souci. Donc je me tourne vers la solution que vous me proposez. Donc si j'ai bien compris :
- je génère un MDP aléatoirement,
- je le stocke dans ma BDD puis lui envoie par mail,
-l'utilisateur se log avec le MDP généré à l'instant.

Donc ci j'ai bien compris il faut que je fasse un update sur la cellule du MDP de l'utilisateur ?
Utilisateur anonyme
il faut que je fasse un update sur la cellule du MDP de l'utilisateur ?
oui, quelque chose du genre
UPDATE abonnes SET mdp=MD5('$mdp') WHERE id=$id

Mais, comme l'a justement fait remarquer Pitet, le MD5 ça n'est vraiment pas top en matière de sécurité.
Messages postés
2371
Date d'inscription
lundi 11 février 2013
Statut
Membre
Dernière intervention
13 janvier 2021
441
Salut,

Pour information le md5 n'est plus sécurisé depuis longtemps et il es déconseillé de l'utiliser pour crypter les mots de passe. Je t'invite à lire cette page pour choisir ta méthode de cryptage : https://www.php.net/manual/fr/faq.passwords.php

Enfin, le but de crypter un mot de passe est justement de ne pas pouvoir le décrypter afin qu'il reste confidentiel. Si un utilisateur a perdu son mot de passe, il dois alors en définir un nouveau.

Bonne journée
Messages postés
403
Date d'inscription
mercredi 7 décembre 2011
Statut
Membre
Dernière intervention
9 mai 2018
56
Concernant le MD5 j'étais au courant, mais je ne sais pas si il y a un équivalent sur PHP et sur MySQL afin que le mot de passe de chaque utilisateur correspondent.
Du moins j'ai vu qu'il existait aussi le SHA1... Cela pourrait convenir ?

À en croire la doc Mysql, SHA1 ne vaut guère mieux. Mais tu as l'embarras du choix, il suffit de regarder le manuel :
https://dev.mysql.com/doc/refman/8.0/en/encryption-functions.html
C'est vraiment très bizarre ton truc.
À quoi sert le DISTINCT sur ton SELECT ? L'id n'est pas unique ?
Quelle idée de recréer un fichier texte qui contient une recopie de ta table, sous une forme moins pratique. Et à chaque connexion à cette page ! C'est beaucoup de travail inutile, non ? Et si par hasard tu as deux connexions à peu près simultanées, il va y avoir un problème.
Et tu réponds à younesase que ton mot de passe est crypté à l'envoi du formulaire : ce n'est pas vrai, sinon pourquoi le crypter à la réception du formulaire ?
$psswdcrypt= md5($_POST['password'])

Je ne comprends pas non plus ta vérification, qui n'autorise que le premier inscrit de ta table puisque tu testes $login1 et $passwd1.

Si tu n'as pas de besoins particuliers (que je ne vois pas dans ton script), une vérification d'identité c'est beaucoup plus simple que ça :

$res=$connect->prepare('SELECT * FROM users_prof WHERE login=? and password= MD5(?)');
$res->execute(array($_POST['login'],$_POST['password']));
if ($row=$res->fetch(PDO::FETCH_ASSOC)) {
  // identifiant reconnu
} else {
  // identifiant non reconnu
}

Tu remarqueras que la fonction MD5 utilisée est dans la requête, c'est ici une fonction de mysql et pas de php. Tu peux donc la remplacer par une de celles de la doc dont je t'ai donné le lien - à condition d'avoir enregistré les mots de passe avec la même fonction !
Messages postés
403
Date d'inscription
mercredi 7 décembre 2011
Statut
Membre
Dernière intervention
9 mai 2018
56
Ah oui c'est pas faux pour le mot de passe, je suis désolé de raconter des bêtises... Je pensais que ce dernier l'était a l'envoie.. Mais non.
En ce qui concerne le code j'avais trouvé un cours php sur les session : http://www.lephpfacile.com/cours/18-les-sessions

Et voici le code qu'il proposait :
<?php
// On définit un login et un mot de passe de base pour tester notre exemple. Cependant, vous pouvez très bien interroger votre base de données afin de savoir si le visiteur qui se connecte est bien membre de votre site
$login_valide = "moi";
$pwd_valide = "lemien";

// on teste si nos variables sont définies
if (isset($_POST['login']) && isset($_POST['pwd'])) {

	// on vérifie les informations du formulaire, à savoir si le pseudo saisi est bien un pseudo autorisé, de même pour le mot de passe
	if ($login_valide == $_POST['login'] && $pwd_valide == $_POST['pwd']) {
		// dans ce cas, tout est ok, on peut démarrer notre session

		// on la démarre :)
		session_start ();
		// on enregistre les paramètres de notre visiteur comme variables de session ($login et $pwd) (notez bien que l'on utilise pas le $ pour enregistrer ces variables)
		$_SESSION['login'] = $_POST['login'];
		$_SESSION['pwd'] = $_POST['pwd'];

		// on redirige notre visiteur vers une page de notre section membre
		header ('location: page_membre.php');
	}
	else {
		// Le visiteur n'a pas été reconnu comme étant membre de notre site. On utilise alors un petit javascript lui signalant ce fait
		echo '<body onLoad="alert(\'Membre non reconnu...\')">';
		// puis on le redirige vers la page d'accueil
		echo '<meta http-equiv="refresh" content="0;URL=index.htm">';
	}
}
else {
	echo 'Les variables du formulaire ne sont pas déclarées.';
}
?>


Au début du code le cours parle de ça :
// On définit un login et un mot de passe de base pour tester notre exemple. Cependant, vous pouvez très bien interroger votre base de données afin de savoir si le visiteur qui se connecte est bien membre de votre site
$login_valide = "moi";
$pwd_valide = "lemien";


c'est pour ça que j'ai fait ma fonction qui écrit et actualise la session. Donc si j'ai bien compris je remplace ma fonction par :

$res=$connect->prepare('SELECT * FROM users_prof WHERE login=? and password= MD5(?)');
$res->execute(array($_POST['login'],$_POST['password']));
if ($row=$res->fetch(PDO::FETCH_ASSOC)) {
  // identifiant reconnu
} else {
  // identifiant non reconnu
}


et ça devrait fonctionner ?
Utilisateur anonyme
Oui, à condition quand même de vérifier si le formulaire a été saisi :
if (isset($_POST['login']) && isset($_POST['pwd'])) {

$_POST['pwd'] ou $_POST['password'] d'ailleurs ? Tu as changé depuis le début.
Messages postés
403
Date d'inscription
mercredi 7 décembre 2011
Statut
Membre
Dernière intervention
9 mai 2018
56
Non rien pourquoi ?
Utilisateur anonyme
Pardon, c'est dans ton exemple qu'ils utilisaient $_POST['pwd']. Effectivement, toi c'est bien $_POST['password'] que tu utilises, je n'ai rien dit.
Messages postés
403
Date d'inscription
mercredi 7 décembre 2011
Statut
Membre
Dernière intervention
9 mai 2018
56
Le père, Merci pour ton aide ! J'ai repris mon code à partir de celui que tu me conseillais et ça fonctionne super bien :)
J'ai encore quelles que questions à te poser,
- Est-ce que je dois faire une vérification du login avec une expression rationnelle afin de prévenir le risque d'injection ?
- J'ai inséré ton code tel que tu me l'as dis mais alors il y a un truc que je ne comprends pas c'est :
SELECT * FROM users_profs WHERE login=? and password= MD5(?);

-Comment MySQL peut comprendre par les points d'interrogation que je lui passe les variable $_POST['login'] et $_POST['password'] ?

Tobi.
"Trois savoirs gouvernent le monde : le savoir, le savoir-vivre et le savoir-faire,
Mais le dernier souvent tient lieu des deux autres."
Lis le manuel PHP, fonction execute de l'objet PDOStatement de PDO :
http://www.php.net/manual/fr/pdostatement.execute.php

J'utilise la méthode "feignante" où on remplace chaque variable par un ? et on fait un execute avec un array qui contient ces variables.
Il serait plus propre de mettre des noms à la place des ? et de passer à execute un tableau avec ces noms comme clés :

$res=$connect->prepare('SELECT * FROM users_prof WHERE login = :login and password= MD5( :password )');
$res->execute(array(':login' => $_POST['login'], ':password' => $_POST['password']));


Avec les requêtes préparées (avec des ? ou des noms, peu importe) tu es automatiquement protégé contre les injections, tu n'as rien de particulier à faire en ce qui concerne la sécurité de ta base.
Mais n'oublie pas que quand tu vas afficher le login, si un petit malin a mis une balise html, voire du javascript dedans, ça risque de faire bizarre.
Personnellement, ma philosophie (d'autres sont possibles) c'est d'accepter dans la base, mais de toujours afficher avec la fonction htmlspecialchars, qui rend tout contenu inoffensif à l'affichage.
Messages postés
403
Date d'inscription
mercredi 7 décembre 2011
Statut
Membre
Dernière intervention
9 mai 2018
56
Très bien encore merci de ton aide ! A toi comme a Younesase d'ailleurs ;)
Je mets le post en résolu même si il va falloir que je me gratte encore la tête ! Encore Merci :)
Messages postés
80
Date d'inscription
samedi 21 avril 2012
Statut
Membre
Dernière intervention
27 avril 2014
3
si c'est facile a décrypter alors ça sert a rien de le crypter.
MD5 est fait pour protéger les informations , par exemple si quelqu'un a pu accéder à ta base de données alors il ne sera pas facile de savoir le mot de passe d'un utilisation si celui là est crypté !!
Messages postés
403
Date d'inscription
mercredi 7 décembre 2011
Statut
Membre
Dernière intervention
9 mai 2018
56
C'est bien ce que je cherche ! Dans ma BD j'ai la signature du mot de passe de l'utilisateur concerné. Quand je rentre mon mot de passe dans le formulaire, à l'envoie du formulaire ce dernier est crypté en MD5 comme ça si un sniffage du réseau se fait et bien il n'y a pas de mot de passe en claire.