Mot de passe crypter

Résolu
labourette Messages postés 670 Statut Membre -  
labourette Messages postés 670 Statut Membre -
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. JooS Messages postés 2705 Statut Membre 228
     
    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
  2. JooS Messages postés 2705 Statut Membre 228
     
    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
    }
    0
  3. labourette Messages postés 670 Statut Membre 6
     
    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
    0
  4. ElementW Messages postés 5690 Statut Contributeur 1 293
     
    " "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...
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. labourette Messages postés 670 Statut Membre 6
     
    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>";
    			}
    }
    ?>
    
    0
  7. JooS Messages postés 2705 Statut Membre 228
     
    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 ...
    0
  8. labourette Messages postés 670 Statut Membre 6
     
    Bonjour
    Merci, merci beaucoup c'est nickel tout fonctionne.
    Bonne semaine.
    0
  9. labourette Messages postés 670 Statut Membre 6
     
    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));
        }
    }
    ?>
    
    0
  10. JooS Messages postés 2705 Statut Membre 228
     
    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 ...
    0
  11. labourette Messages postés 670 Statut Membre 6
     
    Bonjour
    Merci maintenant cela fonctionne très bien.
    Merci
    0