Connexion mot de passe crypté sha1

Signaler
-
 omlaly -
Bonjour

Après avoir fait l'inscription, je développe la connexion. Mais je rencontre un problème avec le mot de passe. Je l'ai crypté en sha1.

Mais lorsque de la connexion, j'aimerais qu'il vérifie l'identifiant ET le mot de passe. Etant donné que dans la base de données le mot de passe est crypté, il ne le reconnait pas.
Si j'enlève dans la requête SQL la vérification du mot de passe, tout marche mais le problème est que si quelqu'un met l'identifiant de l'administrateur SANS mot de passe, il se connecte !!!

Je vous mets le code :

$champ = sha1($_POST['champ']);

$query mysql_query("SELECT champ FROM table WHERE champ_bdd '$champ'  ") or die('message d'erreur'.mysql_error()); 


Alors ma question est : Comment reconnaître le mot de passe converti en sha1 dans la base de données depuis le formulaire ?

En attendant, je continue mes recherches...
Cordialement

50 réponses

Ce qui m'inquiète, c'est que quelque soit le mot de passe saisi, il a le même cryptage :

 da39a3ee5e6b4b0d3255bfef95601890afd80709


C'est normal ?
Cordialement
En relisant tout, j'ai vu qu'en faisant un copier/coller, j'ai supprimé un truc dans le code !

Alors, le vrai code, c'est :

$champ = sha1($_POST['champ']);


$query mysql_query("SELECT champ FROM table WHERE champ_bdd '$champ' AND champ_bdd = '$champ'  ") or die('message d'erreur'.mysql_error()); 


Désolé
Ce n'est pas la requête qui plante car ça n'affiche pas le message d'erreur.
Après cette requête, j'ai fait un test :
if(mysql_num_rows($query) == 1){
echo "<center>Vous êtes authentifié. Merci...</center>";
}
else
// Test si l'utilisateur est inscrit - réponse négative
   echo "<center>Vous n'êtes pas inscrit. Merci de vous inscrire.</center>";
}


Ca ne passe pas par le premier test (message : vous n'êtes pas authentifié. Merci...) mais ça passe directement au else !

Dans la base de données, il y a bien l'utilisateur !!!

Quelqu'un voit où est le problème ?
Messages postés
14755
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
6 janvier 2021
150
Bonjour,

Il te suffit de hasher le mdp, puis de comparer la valeur hashée.

---------------------------------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS, celui-ci pour bien poser votre question ou encore celui-ci pour les PFE et autres exercices.[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : ).[*]En VB.NET pensez à activer Option Explicit et Option Strict (propriété du projet) et à retirer l'import automatique de l'espace de nom Microsoft.VisualBasic (onglet Références dans les propriétés du projet).[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés/list
---
Merci mais comment ?
Peux-tu me donner un exemple STP ?

En attendant, je vais me pencher la dessus...
Cordialement
En recherchant, j'ai vu que la méthode grain de sel :
    $grain = 'ce qu'on veut';
$mdp = $_POST['champ'];
    $sel = 'ce qu'on veut';
    $sha1 = sha1($grain.$mdp.$sel);


protégait mieux que la méthode sha1 :
	// define('PREFIXE_SHA1', 'p8%B;Qdf78');
// $mdp = $_POST['champ'];
// $mdp_sha1 = sha1(PREFIXE_SHA1.$champ);


Est-ce que c'est vrai ?

Comment faire pour hasher le mdp, puis de comparer la valeur hashée ? J'ai testé des trucs mais quand j'essaye ça ne marche pas...

En attendant vos réponses, je continue mes recherches en espérant trouvé...
Cordialement
C'est pas avec l'aide de la fonction PHP crypt ?

Cordialement
J'ai essayé cette requête mais ça ne marche toujours pas :

$query = mysql_query("SELECT * FROM table WHERE champ_bdd='".$identifiant_connexion."' AND champ_bdd_mdp = '".sha1($_POST['$password_connexion'])."'") or die('Erreur lors de la connexion'.mysql_error());


Si quelqu'un pourrait me dire la marche à suivre, ce serait sympa...
Cordialement
J'ai avancé. Maintenant, le problème c'est que la chaîne de caractères du mot de passe crypté n'est pas la même dans la base de données et sur le site.
Quand je vais dans la base de données (phpmyadmin), la chaine de caractères du mot de passe est :
 4228edfb978ba56aa49e800964af3e5e8497540d

Quand je fais le test à partir du site, il me met cette erreur MySQL :
Erreur lors de la connexionYou have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '4062131c67aa967ebe1481fca43abc8832349911')'' at line 1


J'en conclue donc que les deux ne sont pas identiques (pourtant j'essaye avec les mêmes données). Est-ce qu'il faut donc au préalable faire un test pour lui faire comprendre qu'il faut "relier" les deux chaines de caractères ? Si oui, comment ? Si ce n'est pas le cas, comment faire ?

En attendant, je continue mes recherches en espérant arriver à mes fins...
Cordialement
Messages postés
14755
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
6 janvier 2021
150
Bonjour,

Quelle est la chaine SQL exécutée (affichée avec un echo par exemple) ?

---------------------------------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS, celui-ci pour bien poser votre question ou encore celui-ci pour les PFE et autres exercices.[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : ).[*]En VB.NET pensez à activer Option Explicit et Option Strict (propriété du projet) et à retirer l'import automatique de l'espace de nom Microsoft.VisualBasic (onglet Références dans les propriétés du projet).[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés/list
---
NHenry, la requête SQL est :

mysql_query("SELECT * FROM user WHERE user_pseudo='".$identifiant_connexion." AND user_mdp=sha1('".$password_connexion_crypte."')'") or die('Erreur lors de la connexion'.mysql_error());


Cordialement
Messages postés
14755
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
6 janvier 2021
150
Bonjour,

Je te parles de la requête executée, pas de la manière dont elle est construite :
$lSQL="SELECT * FROM user WHERE user_pseudo='".$identifiant_connexion." AND user_mdp=sha1('".$password_connexion_crypte."')'";
Echo lSQL;
mysql_query(lSQL) or die('Erreur lors de la connexion'.mysql_error());

Enfin en fion de requête :
"')'"
Il y a pas un ' en trop ou mal placé ?

---------------------------------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS, celui-ci pour bien poser votre question ou encore celui-ci pour les PFE et autres exercices.[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : ).[*]En VB.NET pensez à activer Option Explicit et Option Strict (propriété du projet) et à retirer l'import automatique de l'espace de nom Microsoft.VisualBasic (onglet Références dans les propriétés du projet).[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés/list
---
J'ai essayé avec ta requête SQL et ça ne me met pas le message d'erreur de la requête SQL.

Quand j'essaye sur le site, ça me met l'erreur suivante :
Erreur lors de la connexionYou have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '4cf997735475afd79f8711e22efaa9d306294785')'' at line 1


Quand je vais sur la base de données via phpmyadmin, le mot de passe crypté en sha1 est :
 4228edfb978ba56aa49e800964af3e5e8497540d


Ce n'est pas le même alors que c'est pour le même utilisateur de test. A mon avis, c'est pour cette raison que ça ne marche pas, il faudrait que ça soit les mêmes chaines de caractères pour un utilisateur sur la base de données et à partir du site. Je ne sais pas comment on fait. Si j'enregistre le mot de passe pas crypté dans la base de données, tout marche. C'est vraiment, je pense, un problème de lecture de mots de passe cryptés dans la base de données.

Qu'est-ce que vous en pensez ?

En attendant vos réponses, je continue mes recherches...
Cordialement
Messages postés
14755
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
6 janvier 2021
150
Bonjour,

Quelle est la requête SQL executée (celle qui s'affiche sur la page WEB (avec le echo) ?

Pour information, j'ai juste repris ta requête, je n'ai rien modifié.
Est-tu sûr que le calcul du mdp hashé est bien le même pour la création et la recherche ?

Bonjour,

Merci de ta réponse.

Sur la page du traitement du formulaire d'inscription, j'ai utilisé le code suivant pour protéger le mot de passe saisi :

	
define('PREFIXE_SHA1', 'p8%B;Qdf78');
$mdp = $_POST['password_connexion'];
$mdp_sha1 = sha1(PREFIXE_SHA1.$password_connexion);


Est-ce que tu peux me donner un exemple complet d'un formulaire de connexion avec un mot de passe crypté en SHA1 dans la base de données pour que je puisse comparer et faire en sorte que l'utilisateur puisse se connecter STP ?

Merci d'avance.

En attendant vos réponses, je continue de chercher en espérant trouvé...

Cordialement
Bonjour,

J'ai réglé le problème du mot de passe. Maintenant, le mot de passe entré sur le site et celui qui est dans la base de données sont les mêmes. Maintenant en testant le site, j'obtiens une erreur SQL à partir du site :
Erreur lors de la connexionYou have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'Nom AND user_mdp=da39a3ee5e6b4b0d3255bfef95601890afd80709' at line 1


où Nom est l'identifiant et da39a3ee5e6b4b0d3255bfef95601890afd80709 le cryptage du mot de passe.

En regardant sur la base de données, les chaînes de caractères du mot de passe sont identiques.
Désormais, je pense que c'est l'identifiant qui pose problème car j'essaye de me connecter avec un identifiant que j'ai inscris auparavant. A noter que j'autorise les espaces dans l'identifiant. L'erreur indique que c'est ce qu'il y a après l'espace qui pose problème, par exemple : prenons un identifiant : Prénom Nom, l'erreur se trouve à partir du N de Nom.

En attendant vos réponses, je continue mes recherches...
Cordialement
Messages postés
14755
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
6 janvier 2021
150
Bonjour,

Cela fait plusieurs fois que je te demande la requête SQL complète telle qu'elle est exécutée, pas sa construction (donc avec les remplacements réels).
Je t'ai même passé un exemple de "comment afficher la chaine en question sur la page web".
Je pense que tu as un problème avec les ' mais sans la requête réellement exécutée, difficile de te répondre.

Je te donne mes deux requêtes SQL (insertion et sélectionnement) :

Voici la requête d'insertion :
$query = mysql_query("INSERT INTO user VALUE('', '', '$pseudo','$password_inscription_sha1', '', '','$email','','','','','')")or die('Erreur lors de l\'insertion !
'.mysql_error()); // Envoie une requête à un serveur MySQL
qui marche
avec
$password_inscription_sha1 = sha1($password_inscription);


Voici la requête pour sélectionner un membre :
$query = mysql_query("SELECT user_pseudo FROM user WHERE user_pseudo=".$identifiant_connexion." AND user_mdp=".$password_connexion_sha1."") or die('Erreur lors de la connexion'.mysql_error()); // Envoie une requête à un serveur MySQL

avec
$password_connexion_sha1 = mysql_real_escape_string(htmlspecialchars(stripcslashes(sha1($_POST['$password_connexion']))));


Voila, lors de l'inscription, ça crypte le mot de passe comme ça :
da39a3ee5e6b4b0d3255bfef95601890afd80709


et lors de la connexion, ça me met le message d'erreur sur le site :
Erreur lors de la connexionYou have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'AND user_mdp=da39a3ee5e6b4b0d3255bfef95601890afd80709' at line 1


Cordialement
Je te mets aussi le code (si mysql retourne au moins un enregistrement) de la page connexion.php

if(mysql_num_rows($query) == 1){ 
echo "<center>Vous êtes authentifié. Merci...</center>";
// Déposer un cookie pour gérer la checkbox "Se souvenir du profil" 	          
        if(isset($_POST['se_souvenir_de_moi'])){
setcookie("cookiepseudo", $_POST['identifiant_connexion'], time()+60*60*24*100, "/");  
  setcookie("cookiepassword", $_POST['password'], time()+60*60*24*100, "/");  
}
else
{
setcookie("cookiepseudo","" , NULL, "/");
setcookie("cookiepassword","" , NULL, "/");  
}
}
else
{
// Test si l'utilisateur est inscrit - réponse négative
   echo "<center>Vous n'êtes pas inscrit. Merci de vous inscrire.</center>";
}
}


Cordialement
Messages postés
14755
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
6 janvier 2021
150
Bonjour,

Erreur lors de la connexionYou have an error in your SQL syntax;


Tu as une erreur dans ta chaine SQL exécutée.
Cela fait plusieurs fois que je te demande une requête réellement exécutée.
Genre :
SELECT ...Nom...da39...

Tu peux l'avoir en affichant avec un echo sur ta page, il faut juste modifier :
$query = mysql_query("SELECT user_pseudo FROM user WHERE user_pseudo=".$identifiant_connexion." AND user_mdp=".$password_connexion_sha1."") or die('Erreur lors de la connexion'.mysql_error()); // Envoie une requête à un serveur MySQL

En :
$lSQL="SELECT user_pseudo FROM user WHERE user_pseudo=".$identifiant_connexion." AND user_mdp=".$password_connexion_sha1."";
echo $lSQL;
$query = mysql_query(lSQL) or die('Erreur lors de la connexion'.mysql_error()); // Envoie une requête à un serveur MySQL


Cela te permettras aussi de faciliter la modification des requêtes SQL.
De plus, avec cette raquête complere, tu pourras vérifier directement dans PHPMyAdmin si elle est correcte et la corriger en conséquence.

---------------------------------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS, celui-ci pour bien poser votre question ou encore celui-ci pour les PFE et autres exercices.[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : ).[*]En VB.NET pensez à activer Option Explicit et Option Strict (propriété du projet) et à retirer l'import automatique de l'espace de nom Microsoft.VisualBasic (onglet Références dans les propriétés du projet).[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés/list
---