Mot de passe crypter

Résolu/Fermé
labourette Messages postés 657 Date d'inscription dimanche 24 août 2008 Statut Membre Dernière intervention 24 juillet 2016 - 6 juil. 2014 à 01:38
labourette Messages postés 657 Date d'inscription dimanche 24 août 2008 Statut Membre Dernière intervention 24 juillet 2016 - 27 juil. 2014 à 08:53
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

JooS Messages postés 2468 Date d'inscription mardi 22 janvier 2008 Statut Membre Dernière intervention 8 juin 2016 228
Modifié par JooS le 7/07/2014 à 01:42
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
JooS Messages postés 2468 Date d'inscription mardi 22 janvier 2008 Statut Membre Dernière intervention 8 juin 2016 228
6 juil. 2014 à 06:09
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
labourette Messages postés 657 Date d'inscription dimanche 24 août 2008 Statut Membre Dernière intervention 24 juillet 2016 6
6 juil. 2014 à 19:39
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
ElementW Messages postés 4816 Date d'inscription dimanche 12 juin 2011 Statut Contributeur Dernière intervention 5 octobre 2021 1 228
6 juil. 2014 à 21:37
" "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

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
7 juil. 2014 à 20:00
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
JooS Messages postés 2468 Date d'inscription mardi 22 janvier 2008 Statut Membre Dernière intervention 8 juin 2016 228
Modifié par JooS le 7/07/2014 à 21:04
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
labourette Messages postés 657 Date d'inscription dimanche 24 août 2008 Statut Membre Dernière intervention 24 juillet 2016 6
7 juil. 2014 à 23:05
Bonjour
Merci, merci beaucoup c'est nickel tout fonctionne.
Bonne semaine.
0
labourette Messages postés 657 Date d'inscription dimanche 24 août 2008 Statut Membre Dernière intervention 24 juillet 2016 6
24 juil. 2014 à 07:39
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
JooS Messages postés 2468 Date d'inscription mardi 22 janvier 2008 Statut Membre Dernière intervention 8 juin 2016 228
Modifié par JooS le 25/07/2014 à 16:11
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
labourette Messages postés 657 Date d'inscription dimanche 24 août 2008 Statut Membre Dernière intervention 24 juillet 2016 6
27 juil. 2014 à 08:53
Bonjour
Merci maintenant cela fonctionne très bien.
Merci
0