Mot de passe crypter

Résolu
Bonjour,
J'ai un formulaire pour insérer les membres et je voudrais crypter au mieux les mot de passe dans ma BDD.
Je me mélange un peu les pinceaux si je peux me permettre.

Pour INSERT j'ai fait omme ça...
				$sql = "INSERT INTO tb_adherent (nom, prenom, adresse_mail, date_naissance, telephone_fixe, telephone_mobile, adresse, lieu_dit, code_postal, ville, login, pass)
						VALUES (:nom, :prenom, :adresse_mail, :date_naissance, :telephone_fixe, :telephone_mobile, :adresse, :lieu_dit, :code_postal, :ville, :login, SHA1(:pass))";
				$requete = $bdd->prepare($sql);
				$requete->bindParam(':nom',						$PARAM['NOM']);
				$requete->bindParam(':prenom',					$PARAM['PRENOM']);
				$requete->bindParam(':adresse_mail',			$PARAM['ADRESSE_MAIL']);
				$requete->bindParam(':date_naissance',			$PARAM['DATE_NAISSANCE']);
				$requete->bindParam(':telephone_fixe',			$PARAM['TELEPHONE_FIXE']);
				$requete->bindParam(':telephone_mobile',		$PARAM['TELEPHONE_MOBILE']);
				$requete->bindParam(':adresse',					$PARAM['ADRESSE']);
				$requete->bindParam(':lieu_dit',				$PARAM['LIEU_DIT']);
				$requete->bindParam(':code_postal',				$PARAM['CODE_POSTAL']);			
				$requete->bindParam(':ville',					$PARAM['VILLE']);
				$requete->bindParam(':login',					$PARAM['LOGIN']);
				$requete->bindParam(':pass',					$PARAM['PASS']);
				$requete->execute();


Pour ma page de vérification j'ai fait ça...
		$salt = "48@!alsd";
		$password_crypte = sha1(sha1($pass).$salt);


Déjà dans ma BDD ça crypte bien le mot de passe.
Pouvez-vous m'expliquer si pour la connexion ça peux fonctionner? étant donné que j'ai couplé le mot de passe avec un grain de sable comme je l'ai vu sur des tutos.
Ma question viens du fait que pour l'INSERT c'est uniquement du SHA1 seul.

Merci beaucoup pour vos explications

10 réponses

  1. Salut,

    Biensure que ça ne peut pas fonctionner, crypter(ici on dis hacher) la chaîne "ABC" et "ABC" concaténé avec "GRAIN" ne donnent forcement pas le même résultat.

    Donc la méthode de cryptage au niveau SQL doit être la même qu'au niveau PHP.

    Alors soit vous utilisez le même grain de sable et la même récursion (au niveau SQL) que dans la page de vérification.
    Soit, avant l'insertion, vous cryptez le mot de passe (PHP) avant de lier la variable (bindParam).

    La deuxième méthode est plus approprié, car le grain de sable ainsi que la méthode de hachage ne se trouveront qu'a un seul endroit.

    Exemple (Security.class.php) :
    class Security {
      const GRAIN = 'f?,j89-k0.;-!?lqjçs_di3%5a6_4jhfgh';
      
      public static function hash($str) {
        return sha1(md5($str) . self::GRAIN . sha1($str . self::GRAIN) . $str);
      }
    }


    Inscription (inclure le fichier Security.class.php) :
    $requete->bindParam(':pass', Security::hash($PARAM['PASS']));


    Authentification (inclure le fichier Security.class.php) :
    if(Security::hash($_POST['pass']) == $data['pass']) {
      // Mot de passe correct
    }
    1. Bonjour
      Merci pour votre retour.
      Je vais essayer de mettre en place votre méthode très bien détaillée et compréhensible.
      Merci
      1. Contributeur
        " "ABC" et "ABC" concaténé avec "GRAIN" ne donnent forcement pas le même résultat.", le "pas forcément" me gène, car dans le cas où
        hash("ABC") == hash("ABC"+grain)
        , c'est qu'il y a un pépin (collision) donc vaut mieux revoir son choix d'algo de hachage...
        1. Toute les fonctions de hachages déclenchent des collisions pour la simple raison que la taille du hach généré est limité, tant-dis que le message en entré non, donc l'ensemble d'entré est beaucoup plus vaste que celui de sortie, d'ou la surjection, et c'est la qu'intervient le système de gestion des collisions.

          A ma connaissance, l'injection n'a jamais pu être implémenté, informatiquement parlé.

          PS : Tout algorithme est jugé bon, jusqu'au jour ou il est cassé.
          1. Bonjour

            Je suis désolé je n'arrive pas à organiser dans ma page authentification la condition
            if(Security::hash($_POST['pass']) == $data['pass']) {
              // Mot de passe correct
            }
            

            Je vous joint mon fichier si vous pouvez m'aider.
            Je vous remercie beaucoup
            <?php
            if (!empty($_POST)) {
                
                if (!empty($_POST['login']) && (!empty($_POST['pass']))) {
                    
                    $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);
            		
            	$sql = ('SELECT *
            		FROM tb_statut
            		INNER JOIN (tb_gestion
            		INNER JOIN ((tb_adherent
            		INNER JOIN tb_adherent_gestion
            		ON tb_adherent.id_adherent = tb_adherent_gestion.rid_adherent)
            		INNER JOIN tb_adherent_statut
            		ON tb_adherent.id_adherent = tb_adherent_statut.rid_adherent)
            		ON tb_gestion.id_gestion = tb_adherent_gestion.rid_gestion)
            		ON tb_statut.id_statut = tb_adherent_statut.rid_statut
            		WHERE (((tb_statut.nom_statut)<>"Démission"))
            		AND login=:login
            		AND pass=:pass') or die(print_r($bdd->errorInfo()));		
            	$requete = $bdd->prepare($sql);								
                $requete->execute(array(
            							':login' => $login,
            							':pass' => $pass
            							));
                $donnees = $requete->fetch();
            
                    if ($donnees['pass'] != $pass) {
                        echo "<span class='erreur_connexion'>Mauvais mot de passe...ou Mauvais login...Merci de recommencer.</br> Peut-être n'êtes vous pas membre de la Clique ?</br>Dans ce cas désolé...</span>";
            
                    } else {		
            				$_SESSION['login']            	= $login;
            				$_SESSION['id_adherent']      	= $donnees['id_adherent'];
            				$_SESSION['nom']              	= $donnees['nom'];
            				$_SESSION['prenom']           	= $donnees['prenom'];
            				$_SESSION['adresse_mail']     	= $donnees['adresse_mail'];
            				$_SESSION['nom_gestion']     	= $donnees['nom_gestion'];
            				$_SESSION['nom_statut']     	= $donnees['nom_statut'];				
            				
            				redir("index.php?body=compte_profil&type=compte");
            
            				}
                } else 	{
            			echo "<span class='erreur'>Veuillez remplir tous les champs !!!</span>";
            			}
            }
            ?>
            
            1. Ajoutez la méthode "clean" a la classe Security.

              public static function clean($str) {
                  return htmlspecialchars(trim($str));
              }


              <?php
              if (!empty($_POST)) {
                  
                  if (!empty($_POST['login']) && (!empty($_POST['pass']))) {
                      
                      // Nettoyer les chaines
                      $login = Security::clean($_POST['login']);
                 
                      $pass = Security::clean($_POST['pass']); 
                      $pass = Security::hash($pass);
               
                      $sql = 'SELECT *
                          FROM tb_statut
                          INNER JOIN (tb_gestion
                          INNER JOIN ((tb_adherent
                          INNER JOIN tb_adherent_gestion
                          ON tb_adherent.id_adherent = tb_adherent_gestion.rid_adherent)
                          INNER JOIN tb_adherent_statut
                          ON tb_adherent.id_adherent = tb_adherent_statut.rid_adherent)
                          ON tb_gestion.id_gestion = tb_adherent_gestion.rid_gestion)
                          ON tb_statut.id_statut = tb_adherent_statut.rid_statut
                          WHERE (((tb_statut.nom_statut)<>"Démission"))
                          AND login = :login
                          AND pass = :pass';  
               
                          $requete = $bdd->prepare($sql);        
                          $requete->execute(array(
                              ':login' => $login,
                              ':pass' => $pass
                          ));
                          $donnees = $requete->fetch();
              
                      // Si la requete ne retourne rien
                      if (empty($donnees)) {
                          echo "<span class='erreur_connexion'>Mauvais mot de passe...ou Mauvais login...Merci de recommencer.</br> Peut-être n'êtes vous pas membre de la Clique ?</br>Dans ce cas désolé...</span>";
              
                      } else {  
                          $_SESSION['login'] = $login;
                          $_SESSION['id_adherent'] = $donnees['id_adherent'];
                          $_SESSION['nom'] = $donnees['nom'];
                          $_SESSION['prenom'] = $donnees['prenom'];
                          $_SESSION['adresse_mail'] = $donnees['adresse_mail'];
                          $_SESSION['nom_gestion'] = $donnees['nom_gestion'];
                          $_SESSION['nom_statut'] = $donnees['nom_statut'];    
                  
                          redir("index.php?body=compte_profil&type=compte");
                      }
                  } 
                  else {
                      echo "<span class='erreur'>Veuillez remplir tous les champs !!!</span>";
                  }
              }
              ?>


              PS : J'allais essayé de corriger la requête, mais je ne comprend pas trop vos règles de jointures, et j'avoues que c'est une façon bizarre et pas trés élégante d'écrire une requête SQL.

              Mettez en résolu quand c'est résolu ...
              1. Bonjour
                Merci, merci beaucoup c'est nickel tout fonctionne.
                Bonne semaine.
                1. Bonjour
                  Excusez moi de revenir sur mon problème, mais je ne sais pas pourquoi je n'arrive pas à me connecter.
                  Lorsque je viens de changer directement le pass dans ma BDD je peux me connecter mais sinon absolument pas.
                  Pouvez vous m'aider s'ils vous plait, je vous joint mon fichier de connexion.
                  Merci beaucoup
                  <?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']))){
                  		
                          $login = Security::clean($_POST['login']);
                  		
                          $pass = Security::clean($_POST['pass']); 
                          $pass = Security::hash($pass);
                          
                  	//on sélectionne les champs que l'on veut récupèrer et on teste les champs login et password
                  	$sql = ('SELECT *
                  			FROM tb_adherent
                  			WHERE login=:login
                  			AND pass=:pass
                  			ORDER BY nom, prenom') or die(print_r($bdd->errorInfo()));
                  	$requete = $bdd->prepare($sql);								
                      //on execute la requète en lui transmettant la liste des paramètres
                      $requete->execute(array(
                  							':login' => $login,
                  							':pass' => $pass
                  							));
                      //on affiche les reponses de la requète dans un tableau
                      $donnees = $requete->fetch();
                  
                          //si le password est différent on met un message d'erreur
                          if ($donnees['pass'] != $pass){
                              echo "<span class='erreur_connexion'>Mauvais mot de passe...ou Mauvais login...Merci de recommencer.</br> Peut-être n'êtes vous pas membre de la Clique ?</br>Dans ce cas désolé...</span>";
                  
                          //sinon
                          }else{		
                  			//on cré des variables accessibles depuis toutes les pages
                  			$_SESSION['login']            	= $login;
                  			$_SESSION['id_adherent']      	= $donnees['id_adherent'];
                  			$_SESSION['nom']              	= $donnees['nom'];
                  			$_SESSION['prenom']           	= $donnees['prenom'];
                  			$_SESSION['adresse_mail']     	= $donnees['adresse_mail'];			
                  
                  			// Utiliser la redirection ---------------
                  			redir("index.php?body=compte_profil&type=compte");
                  		}
                      }else{
                  		echo "<span class='erreur_connexion'>Veuillez remplir tous les champs !!!</span>";
                  	}
                  }
                  ?>
                  

                  la fonction du hachage
                  <?php
                  //Méthode de hachage pour le password
                  class Security{
                      const GRAIN = 'f?,j89-k0.;-!?lqjçs_di3%5a6_4jhfgh';
                  
                      public static function hash($str){
                          return sha1(md5($str) . self::GRAIN . sha1($str . self::GRAIN) . $str);
                      }
                      public static function clean($str){
                          return htmlspecialchars(trim($str));
                      }
                  }
                  ?>
                  
                  1. La requête est supposé retourner un seul résultat au plus (puisque le login est unique), donc pas la peine de faire un ORDER BY.
                    La requête retourne un résultat vide si "le login existe mais le mot de passe est incorrect", ou si le login n'existe pas,
                    Sinon, elle retourne un résultat contenant un seul tuple dans le cas ou le login et le mot de passe sont corrects (en même temps).

                    Donc,
                    Si résultat vide
                        Afficher "Mauvais login ou mot de passe."
                    Sinon
                        Bienvenue.


                    Revenez à la dernière version que j'ai posté.
                    https://forums.commentcamarche.net/forum/affich-30462420-mot-de-passe-crypter#6

                    Mettez en résolu quand c'est résolu ...