[RESOLU] Changer mot de passe PHP/CRYPTAGE

Bodyfull
Invité n'ayant pas de compte PHPfrance

29 avr. 2012, 19:39

Salut,

Je veux comparer le mot de passe rentré dans un formulaire avec celui stocké actuellement dans la BDD.
Or, le mot de passe stocké dans la BDD est crypté, et je bloque :
     // Là je tente de crypter le mot de passe rentré dans le form.
             $verification_pass = hash('sha256', $_POST['pass']);   
             $verification_pass1 = createSalt();
             $verification_pass2 = hash('sha256', $verification_pass1 . $verification_pass);
	    // Et ici de comparer les deux chaines cryptées voir si elles sont bien identiques.
            if($requete_array['password'] != $verification_pass2)
            {
                $show_err[] = 'Le mot de passe actuel est erroné !';
                $err = 1;
            }
Soucis, cela ne fonctionne pas car cela me dit constamment que le mot de passe actuel est érroné ! :(
Comment faire ?

Merci à vous !

ViPHP
xTG
ViPHP | 7331 Messages

29 avr. 2012, 20:15

Les mots de passe de la BDD ont-ils été cryptés suivant ce procédé ?
Notamment il faudrait vérifier la fonction createSalt() et confirmer qu'entre temps elle n'a pas évolué.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

29 avr. 2012, 20:31

Et est ce que le grain de sel est toujours le même ?

Si ce n'est pas le même il faut qu'il soit stocké quelque part pour le réutiliser (donc en base? Tbrecupere mot de passe et grain de sel et tu compare avec le hash reconstitué à partir de l'info de la dB).

Pour info on ne parle pas la de cryptage mais de hashage la différence essentielle c'est que le premier est réversible pas le second ;)

@+
Il en faut peu pour être heureux ......

Bodyfull
Invité n'ayant pas de compte PHPfrance

30 avr. 2012, 23:08

Bonsoir,

Oui, tout a été effectué de la même manière, même grain de sel.
Et c'est effectivement ce que je cherche à faire, comparer le mot de passe rentré avec celui utilisé dans la BDD.

Pour l'instant, j'ai fais comme ceci (c'est comme ça que je vérifie si le MDP est correct à la connexion) :
                    $verification = mysql_fetch_array($requete, MYSQL_ASSOC);
                    $ash = hash('sha256', $verification['salt'] . hash('sha256', $_POST['pass']));
                   
                    if($ash != $verification['password'])
                    {
						$show_err[] = 'Le mot de passe ne correspond pas celui utilisé actuellement !';					
                        $err = 1;
                    }
Mais cela ne passe pas...
$requete récupère les données de l'utilisateur qui a une session ouverte, $_POST['pass'] est le mot de passe rentré dans le formulaire.

ViPHP
xTG
ViPHP | 7331 Messages

30 avr. 2012, 23:13

On peut voir le code d'insertion de ces mots de passe dans la BDD ? (Et notamment la façon dont ils ont été hashé)

Bodyfull
Invité n'ayant pas de compte PHPfrance

01 mai 2012, 10:23

A l'inscription, c'est fais comme ceci :
                // On hash le mot de passe.
                $dmx_password_hash = hash('sha256', $_POST['password']);
                // On crée une valeur de salage.
                $dmx_user_salt = createSalt();
                // On crée l'ash.
                $dmx_user_password = hash('sha256', $dmx_user_salt . $dmx_password_hash);
C'est ça que vous vouliez voir ? :?

ViPHP
xTG
ViPHP | 7331 Messages

01 mai 2012, 10:31

Bon donc on est d'accord sur l'enchaînement, montres nous la fonction createSalt() maintenant.

Bodyfull
Invité n'ayant pas de compte PHPfrance

01 mai 2012, 11:20

	function createSalt()
    {
        $string = md5(uniqid(rand(), true));
        return substr($string, 0, 3);
    }
Voilou :)

ViPHP
xTG
ViPHP | 7331 Messages

01 mai 2012, 12:21

Dans ce cas j'espère que c'est bien le retour de cette fonction qui est enregistré en bdd pour $verification['salt'].
Et qu'il n'y a pas eu de chaînes coupées lors de l'insertion en bdd.

Car sinon, on ne peut que soutenir que ton code est correct.
Donc si cela ne fonctionne pas, c'est que véritablement le mdp est incorrect, ou que le mdp hashé a été coupé ou bien son salt.

Bodyfull
Invité n'ayant pas de compte PHPfrance

01 mai 2012, 13:00

Impossible !

Cela fonctionne à la connexion, lorsqu'on vérifie le MDP, pourquoi ça ne fonctionnerait pas ici. :(
*****************************************************
*     On va chercher les informations du membre     *
*****************************************************
*/    

$requete = mysql_query("SELECT * FROM users WHERE email = '". $_SESSION['dmx_email'] ."'");
$requete_array = mysql_fetch_array($requete);

/*
*****************************************************
*     On va chercher les informations du membre     *
*****************************************************
*/  

	if(isset($_POST['submit_pass']))
	{
	
			// On vérifie que le nouveau mot de passe est correct.     
            if((strlen($_POST['pass_news']) < dmx_config_passminlength) || (strlen($_POST['pass_news']) > dmx_config_passmaxlength))
            {
                $show_err[] = 'Le nouveau mot de passe doit être compris entre 6 et 32 caractères !<br />';
                $err = 1;
            }
			
            if($_POST['pass_news'] != $_POST['pass_news_confirm'])
            {
                $show_err[] = 'Les mots de passes inscrits ne sont pas identiques !<br />';
                $err = 1;
            }	

                    $verification = mysql_fetch_array($requete, MYSQL_ASSOC);
                    $ash = hash('sha256', $verification['salt'] . hash('sha256', $_POST['pass']));
                   
                    if($ash != $verification['password'])
                    {
						$show_err[] = 'Le mot de passe ne correspond pas celui utilisé actuellement !';					
                        $err = 1;
                    }

				if ($err != 1)
				{
                    $nouveau_salage = createSalt();
                    $nouveau_pass = hash('sha256', $nouveau_salage . hash('sha256', $_POST['pass_news_confirm']));
                    mysql_query("UPDATE users SET password = '$nouveau_pass', salt = '$nouveau_salage' WHERE id = '" . $requete_array['id'] . "'");
				}
				
			else
			{
            echo '<div style="margin-bottom: -20px;" class="error-box2">';
            echo join('',$show_err);
            echo '</div>';
			}
	
	}

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

01 mai 2012, 18:21

la ligne
$verification = mysql_fetch_array($requete, MYSQL_ASSOC);

est de trop $verification doit valoir false étant donné que tu fait déja un mysql_fetch_array() ligne 7 (et que je suppose que tu n'a qu'un résultat par adresse mail dans la table ?

donc utilise $requete_array ou garde cette ligne et vire la ligne 7

pour info y a des chances que php se vautre dans les chaine de caractère vu les nom de variable
par exemple :
"UPDATE users SET password = '$nouveau_pass', salt = '$nouveau_salage' WHERE id = '" . $requete_array['id'] . "'"

vu qu'a priori, tu connais la concaténation utilise la pour chaque variable.
pourquoi ? parce que :
- c'est plus clair
- plus lisible
- pas de risque que la parseur se vautre en cherchatn ce qu'il doit remplacer

@+
Il en faut peu pour être heureux ......

Bodyfull
Invité n'ayant pas de compte PHPfrance

01 mai 2012, 18:41

Salut,

C'était ça !!

Le fait de re-spécifier un tableau.. :D
J'ai ajouté quelques petits trucs pour sécuriser et je vais voir pour ton conseil, j'ai du boulot qui m'attends !

Encore merci à cette fabuleuse communauté !! :wink:

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

01 mai 2012, 19:29

de rien !)

je te conseil aussi d'afficher les erreurs tu aurais trouvé seul => error_reporting c'est obligatoire en phase de dev sinon tu t'en sort pas (ou t'est très bon a voir :mrgreen: ).

@+
Il en faut peu pour être heureux ......