Crypter le mot de passe

Résolu/Fermé
labourette Messages postés 657 Date d'inscription dimanche 24 août 2008 Statut Membre Dernière intervention 24 juillet 2016 - 15 déc. 2013 à 19:59
labourette Messages postés 657 Date d'inscription dimanche 24 août 2008 Statut Membre Dernière intervention 24 juillet 2016 - 19 déc. 2013 à 09:47
Bonjour

J'ai créé mon formulaire de connexion pour les membres.
Je souhaite rajouter "Sha1 pour crypter le MDP"

Pouvez vous m'aider s'ils vous plait, je n'arrive absolument pas à mettre en place le cryptage.
Si vous pouvez également me donner votre avis sur mon formulaire sur la sécurisation.
Un grand merci à tous

<?php
//on teste si le visiteur a soumis le formulaire
if (!empty($_POST)) {
	
    //on vérifie si le login et password ne sont pas vide, nulle ou non définie
    if (!empty($_POST['login']) && (!empty($_POST['pass']))) {
	
	//cryptage sha1 du mot de pass
	$pass = sha1($pass);	
	
        //on récupère les valeurs des champs
        $login = trim($_POST['login']); //supprime les espaces en début et fin de chaine
        $login = htmlspecialchars($login, ENT_QUOTES); // supprime les caracteres speciaux html dans la chaine
        $login = stripslashes($login); // Supprime les antislashs d'une chaîne. 
        
        $pass = trim($_POST['pass']);
        $pass = htmlspecialchars($pass, ENT_QUOTES);
        $pass = stripslashes($pass);
	
        //on sélectionne la table identifiant et on teste le champ login
        $resultats = $bdd->query("SELECT * FROM t_identifiant WHERE login='" . $login . "'");
	
        // on affiche la requète
        $donnees   = $resultats->fetch(PDO::FETCH_ASSOC);
	
        //si le password est différent on met un message d'erreur
        if ($donnees['pass'] != $pass) {
            echo "<span class='erreur'>Mauvais mot de passe...ou Mauvais login...Merci de recommencer.</span>";
        }
        //sinon c'est bon
        else {
            //on cré des variables accessibles depuis toutes les pages
            $_SESSION['id_identifiant'] = $donnees['id_identifiant'];            
	    $_SESSION['login']          = $login;
            $_SESSION['pass']           = $donnees['pass'];	    

            // Utiliser la redirection ---------------
            header('Location: index.php?body=gestion_profil&type=profil');
            
        }
    } else {
        echo "<span class='erreur'>Veuillez remplir tous les champs !!!</span>";
    }
}
?>

10 réponses

JooS Messages postés 2465 Date d'inscription mardi 22 janvier 2008 Statut Membre Dernière intervention 8 juin 2016 228
Modifié par JooS le 15/12/2013 à 20:24
Salut,

Le code suivant est a mettre a la 19eme ligne.
//cryptage sha1 du mot de pass
$pass = sha1($pass);


Tu as oublié le cas ou l'utilisateur n'existe pas.
Tu ne gère pas les injections SQL, utilises les requêtes préparés.
$resultats = $bdd->prepare('SELECT * FROM t_identifiant WHERE login=:log');
$resultats->execute(array(':log' => $login));
$donnees = $resultats->fetch(PDO::FETCH_ASSOC);


Avant d'exécuter la requête, il faut vérifier encore une fois si le login et mot de passe ne sont pas vides, car après le nettoyage des variables que tu as fait, il se peut que la variable contenant un espace avant et que l'espace a été supprimé avec trim, donc la variable est en fait vide.

htmlspecialchars et stripslashes ne servent pas a grand chose dans le cas du mot de passe, puisque dans tout les cas tu va hasher le mot de passe avec sha1.

Mettez en résolu quand c'est résolu -.- ...
0
labourette Messages postés 657 Date d'inscription dimanche 24 août 2008 Statut Membre Dernière intervention 24 juillet 2016 6
15 déc. 2013 à 20:51
Bonjour, Merci ta réponse.
En fait il y a quelque chose que j'ai oubliè de signaler. En fait j'ai rempli dans ma BDD tous les logins et mot de passe des membres manuellement.

Ensuite tous les membres qui souhaites se connecté demande via le lien" vous avez oublié vos identifiants cliquez ici"

Lorsque je rajoute "Sha1" à la ligne 19 le message me dit "Mauvais mot de passe ou login".

Sinon sans le sha1 tout fonctionne pourquoi à ton avis.
Merci beaucoup de ton aide
0
labourette Messages postés 657 Date d'inscription dimanche 24 août 2008 Statut Membre Dernière intervention 24 juillet 2016 6
15 déc. 2013 à 21:01
Excuse moi c'est moi qui est fait une bourde j'avais oublié de crypter dans ma BDD en Sha1 tout fonctionne à merveille.
Je te remercie bonne soirée
0
labourette Messages postés 657 Date d'inscription dimanche 24 août 2008 Statut Membre Dernière intervention 24 juillet 2016 6
Modifié par pijaku le 19/12/2013 à 10:03
Bonjour
Je reviens vers toi car j'ai un grave problème, si tu as un peu de temps pour y jeter un oeil avec un grand merci.
En fait j'ai testé sur mon serveur le retour du mot de passe oublié par un utilisateur mais pour le moment sans cryptage du mot de passe déjà pour faire fonctionner le reour par mail.
Cela me retourne le Mot de passe c'est le Login
et le Login c'est l'adresse mail.
S'il te plait peut tu m'aider?
Merci

<?php
//si la variable $email n'est pas vide
if(!empty($_POST['email']))
{
$email = stripslashes(htmlspecialchars(trim($_POST['email']), ENT_QUOTES));
$nom_form = stripslashes(htmlspecialchars(trim($_POST['nom']), ENT_QUOTES));
$prenom_form = stripslashes(htmlspecialchars(trim($_POST['prenom']), ENT_QUOTES));

$reponse = $bdd->query("SELECT t_gestion_adherent.nom, t_gestion_adherent.prenom, t_gestion_adherent.adresse_mail, t_identifiant.login, t_identifiant.pass
   FROM t_gestion_adherent
   INNER JOIN t_identifiant
   ON t_gestion_adherent.id_adherent = t_identifiant.rid_adherent
   WHERE adresse_mail='$email' 
   AND nom='$nom_form' 
   AND prenom='$prenom_form'");

 if (list($nom, $prenom, $login, $pass) = $reponse->fetch()) //on affiche les champs dans un tableau
 {
  $mail=mail( $email , //on affiche la mail 
        "Rappel de tes identifiants",
        "Bonjour," .$prenom. "\n
        Tu as perdu ton mot de passe et ton Login...les voici...\n
        Ton login est :
        " .$login. "\n        
        Ton mot de passe est :
         ".$pass." \n
        A bientot !
        Gilbert\n
        "From: monadresse.fr <monadresse@orange.fr>");
  if($mail) //si le mail est bon.....sinon......sinon
   echo"<span class='erreur'><b><font color='red'>Ton mot de passe et ton Login<br/>viens de t-être envoyé à l adresse :<br/> $email <br/>Tu va les recevoir dans quelques minutes.</font></b></span>";
  else
   echo"<span class='erreur'><b><font color='red'>Le mot de passe ne peux t-être envoyé!<br>Renouvelle ta demande dans un instant.<br/></font></b></span>";
 }
 else
  echo"<span class='erreur'><b><font color='red'>Ton adresse ne correspond pas<br/>avec ton nom et ton prénom!</font></b></span>";
}
?>

<center>

<span class="recevoir">
Tu as perdu ton login et / ou ton mot de passe ?<br/>
Entre ton Nom, Prénom et Adresse E-mail...<br/>
Tes identifiants te seront alors envoyé à cette adresse ! <br/>
Merci
</span>

<br/><br/>

<div id="form_envoye">
 <form name="form_connexion" id="ConnexionForm" action="index.php?body=identifiant_envoye&type=accueil" method="post" enctype="multipart/form-data">
  <fieldset class="cadre">
   <legend>Réservé aux membres</legend>
      
   <label for="nom">Ton nom :</label>  
   <center><input type="text" id="nom" name="nom" class="nom" value="" tabindex="1"/></center><br/>
   
   <label for="prenom">Ton prénom :</label> 
   <center><input type="text" id="prenom" name="prenom" class="prenom" value="" tabindex="2"/></center><br/>
   
   <label for="adresse_mail">Ton adresse mail :</label> 
   <center><input type="text" id="adresse_mail" name="email" class="adresse_mail" value="" tabindex="3"/></center>

   <center><input  src="image/envoyer.png" width="30%" type="image" name="connexion" class="form_connexion" border="0" Value="" align="middle"/></center> 
  </fieldset>
 </form>
</div>
0
JooS Messages postés 2465 Date d'inscription mardi 22 janvier 2008 Statut Membre Dernière intervention 8 juin 2016 228
17 déc. 2013 à 09:47
Regarde ce que tu as sélectionné et l'ordre dans le quel tu l'as fait !

Tu as utiliser la fonction list donc !
La première case du tableau que retourne la requête sera affecté au premier paramètre de list.
La deuxième case du tableau que retourne la requête sera affecté au deuxième paramètre de list.
etc.

Dans ton cas, le troisième champs que tu as sélectionné est l'adresse email, donc il est affecté au troisième paramètre de la fonction qui n'est autre que "$login".
et le quatrième champs que tu as sélectionné est le login, donc il est affecté au quatrième paramètre de la fonction qui n'est autre que "$pass".

PS : Je vois que mes conseils d'utiliser les requêtes préparés n'a pas été pris en considération.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
labourette Messages postés 657 Date d'inscription dimanche 24 août 2008 Statut Membre Dernière intervention 24 juillet 2016 6
17 déc. 2013 à 10:06
Bonjour
Merci pour avoir résolu mon soucis.
En fait je ne savait pas que l'ordre était indispensable désolé en tout cas un grand merci.
PS en ce qui concerne les requète préparée je ne connait pas trop j'ai bien cherché mais rien ne voulait fonctionner, je vais encore essayé et si ça ne fonctionne pas je posterai.
Merci de ton aide
0
Utilisateur anonyme
17 déc. 2013 à 16:41
Bonsoir,

heureux que ton problème soit résolu.

petite parenthèse : il me semble que les méthodes md5 et du sha1 ne font pas du cryptage mais du hachage.

Dans la pratique ça change rien, mais je tenais quand même à le préciser ;p

https://forums.commentcamarche.net/forum/affich-821070-cryptage-hachage

A+ Seezer
0
gardiendelanuit Messages postés 1769 Date d'inscription jeudi 20 décembre 2007 Statut Membre Dernière intervention 19 novembre 2016 264
17 déc. 2013 à 16:55
Yup c'est bien du hachage (algorithme non réversible).
Je rajoute mon grain de sel avec la méthode "grain-de-sel" qui consiste à rajouter une chaîne courte aléatoire (caractères spéciaux) après la chaîne à hacher et qui permet une sécurité bien plus forte (surtout avec les algo comme sha1 et md5 qui sont maintenant dépassés.
0
JooS Messages postés 2465 Date d'inscription mardi 22 janvier 2008 Statut Membre Dernière intervention 8 juin 2016 228
17 déc. 2013 à 18:59
Concernant les algorithmes, il est déconseillé d'utiliser md5 et sha1 pour chiffrer les mots de passe, mais bon, ce n'était pas réellement la question, donc puisque vous en parlez, PHP conseille d'utiliser la fonction "crypt" avec l'algorithme Blowfish.

Si il faut ajouter une chaîne, il vaut mieux le faire :
au début.
ou encore mieux, début et fin.
ou encore bien meilleur, à disperser dans le texte, pour que même si le cryptanalyse arrive a trouver la chaîne originale, il ne pourra pas distinguer le grain de sel du mot de passe.

Exemple, trouvez le mot de passe :
1 : 7sdfDSFsf9sdd3NJ_fsd(è-ç_'QNLmon_motDe_passek,sdjèéjnéçnd345jnsk3453ldc,qss_
2 : 7sdfmDSoFsfn9s_dd3NJ_fsd(è-ç_'QNLmk,sodjètéjnDéçend3_45jpnsk3a453sldcs,qses_

Une chaîne courte ! au contraire, ajouter ou non un grain de sel n'empêchera pas le cryptanalyse de trouver la chaîne originale, mais ça lui fera perdre du temps, voir beaucoup de temps au point de le décourager et l'obliger à abandonner, donc plus la chaîne est longue(à une certaine limite), plus c'est mieux.
0
gardiendelanuit Messages postés 1769 Date d'inscription jeudi 20 décembre 2007 Statut Membre Dernière intervention 19 novembre 2016 264
Modifié par gardiendelanuit le 17/12/2013 à 20:34
Mais le fait d'ajouter un grain de sel change le hachage entier, il n'y a donc pas de différenciation possible entre le mdp hashé + le mdp hashé avec grain de sel.
Dans le cas où une chaîne longue est utilisée avant le hachage, le nombre de chance de collisions augmente en fonction de l'algo utilisé (possibilité d'avoir deux rendu identique avec deux entrées différentes - même s'il faut forcer, hein).
0
JooS Messages postés 2465 Date d'inscription mardi 22 janvier 2008 Statut Membre Dernière intervention 8 juin 2016 228
17 déc. 2013 à 22:57
Certes, c'est le hash qui change complètement, mais je parle de la chaîne originale !

Chaîne originale : 7sdfDSFsf9sdd3NJ_fsd(è-ç_'QNLmon_motDe_passek,sdjèéjnéçnd345jnsk3453ldc,qss_
Hash via md5 : c5f80bc76f6eafcc624f75eaf0a99e00

Disons qu'un cryptanalyse, par brute force arrive a trouver la chaîne originale (ce qui est improbable ici a cause de la longueur de la chaîne originale), en analysant manuellement (visuellement) la chaîne qu'il a trouver, il peux facilement et sans effort distinguer le mot de passe (qui généralement a un sens) du grain de sel ajouté (qui généralement n'est qu'une chaîne de caractères choisis aléatoirement).

Chaîne originale : 7sdfmDSoFsfn9s_dd3NJ_fsd(è-ç_'QNLmk,sodjètéjnDéçend3_45jpnsk3a453sldcs,qses_
Hash via md5 : 1505cb24899772f46a605ab96d11607a

Dans ce deuxième cas, même si le cryptanalyse arrive a trouver la chaîne originale, il ne pourra rien faire avec car le mot de passe a été dispersé dans le texte complet avant que le tout n'a été hashé, sauf si il possède plusieurs chaînes originales, dans ce cas il pourra les comparer afin de comprendre l'algorithme qui disperse les lettres dans le texte complet, mais bon, on lui aura quand même rendu la vie un peu plus difficile !

Concernant la longueur, l'algorithme md5 divise la chaîne d'entré en bloc de 512bits, c'est a dire 128 caractères, or, si ta chaîne d'entré n'a pas dépasser les 128 caractères, l'algorithme doit compléter avec des 1 et des 0, donc mieux vaut que tu remplisses le plus possible avec quelque chose qui vient de toi, plutôt que ça se remplisse automatiquement avec un truc par défaut.
0
labourette Messages postés 657 Date d'inscription dimanche 24 août 2008 Statut Membre Dernière intervention 24 juillet 2016 6
17 déc. 2013 à 17:14
Merci vraiment à vous tous.
0
labourette Messages postés 657 Date d'inscription dimanche 24 août 2008 Statut Membre Dernière intervention 24 juillet 2016 6
17 déc. 2013 à 22:57
Permettez moi de vous poser une question concernant le SHA1 dans la BDD MySQL.
Pour mettre les mots de passe en sha1 il faut le faire manuellement pour tous les mots de passes dans la BDD ?
Merci
0
JooS Messages postés 2465 Date d'inscription mardi 22 janvier 2008 Statut Membre Dernière intervention 8 juin 2016 228
Modifié par JooS le 18/12/2013 à 16:37
ça dépend, si les mots de passes sont enregistrés dans leur état original :
UPDATE table 
SET pass = sha1(pass);
0
labourette Messages postés 657 Date d'inscription dimanche 24 août 2008 Statut Membre Dernière intervention 24 juillet 2016 6
19 déc. 2013 à 09:47
Bonjour
Super très bien je te remercie.
0