Mot de passe crypter
Résolu
labourette
Messages postés
657
Date d'inscription
Statut
Membre
Dernière intervention
-
labourette Messages postés 657 Date d'inscription Statut Membre Dernière intervention -
labourette Messages postés 657 Date d'inscription Statut Membre Dernière intervention -
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...
Pour ma page de vérification j'ai fait ça...
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
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
A voir également:
- Mot de passe crypter
- Trousseau mot de passe iphone - Guide
- Mot de passe - Guide
- Mot de passe administrateur - Guide
- Mot de passe bios perdu - Guide
- Voir mot de passe wifi android - Guide
10 réponses
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é.
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é.
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) :
Inscription (inclure le fichier Security.class.php) :
Authentification (inclure le fichier Security.class.php) :
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 }
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
Merci pour votre retour.
Je vais essayer de mettre en place votre méthode très bien détaillée et compréhensible.
Merci
" "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...
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Bonjour
Je suis désolé je n'arrive pas à organiser dans ma page authentification la condition
Je vous joint mon fichier si vous pouvez m'aider.
Je vous remercie beaucoup
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>"; } } ?>
Ajoutez la méthode "clean" a la classe Security.
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 ...
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 ...
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
la fonction du hachage
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)); } } ?>
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,
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 ...
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 ...