IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Cryptage


Sujet :

Langage PHP

  1. #1
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2011
    Messages
    754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2011
    Messages : 754
    Points : 376
    Points
    376
    Par défaut Cryptage
    Bonjour,

    j'ai un problème avec le cryptage de mon mot de passe (je sais qu'il existe d'autre méthode plus approprié que md5, mais en occurrence, le problème n'est pas là).
    Mon mot de passe crypté en BDD n'est pas celui que je devrais avoir.

    Je crée un user que j'insère en base par le biais d'un Manager dont voici le code essentiel.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    function __construct(){
        $this->db = new PDO('mysql:host='.DB_HOST.';dbname='.DB_NAME.';charset=utf8',DB_USER,DB_PWD);
        $this->classname = "User";
    }
     
     
    //insert an user into db
    function insertUser($user){
        $request="INSERT INTO users 
                    values(".$user->toString().")";
        $res=$this->db->query($request);
        if(!$res){
            return false;
        }else{
            return true;
        }
    }
     
    $s_admin=new User(1,FIRST_S_ADMIN_LOGIN,FIRST_S_ADMIN_MDP,'SUPER_ADMIN');
    $res=$this->insertUser($s_admin);
    Les constantes utilisés ici sont les suivantes:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    	define('FIRST_S_ADMIN_LOGIN','admin_myor');
    	define('FIRST_S_ADMIN_MDP','admin_myor');
    Il s'agit d'un login/mdp destiné à être changé dès la première connexion au backend à l'installation du site, mais passons ça n'a pas vraiment d'importance ici.

    Dans ma classe User, voici la méthode toString et setPassword

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    function setPassword($password){
        $this->user_password=md5($password);
    }
     
    //return the string value for insertion
    function toString(){
        return "'".$this->getId()."',"."'".$this->getLogin()."','".$this->getPassword()."','".$this->getRole()."'";
    }
    Le problème c'est que le md5 de FIRST_S_ADMIN_MDP vaut b56a77495c197cfc519468e75fd08342 (vérifié avec un var_dump du md5 de la constante)

    Or, quand je regarde en BDD, dans ma colonne password, j'ai ceci bc3d54bd2d8e9fa615efea29dcb03495

    Je ne comprends donc pas pourquoi puisque setPassword utilisé dans le constructeur de la classe user utilise md5 également.

    Merci pour votre aide, j'avoue être un peu perdu.

  2. #2
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 235
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 235
    Points : 15 532
    Points
    15 532
    Par défaut
    le résultat "bc3d54bd..." est le hachage MD5 de "b56a77495c197cf..." donc il doit y avoir un double hachage quelque part dans votre code.

  3. #3
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    Par défaut
    Hypothèse en partant de ce qu'indique mathieu :
    Lorsque tu lis la donnée en base, pour construire ton objet, tu utilises les setters de la classe. Or setPassword fait appel à md5(). Donc à chaque lecture de l'utilisateur tu ré-encodes le mot de passe.

    Il vaudrait donc mieux réaliser l'encodage à l'extérieur du setter (soit par l'appelant, soit par une fonction distincte).

    (et sinon, oui, md5 n'est pas une bonne solution pour gérer le mot de passe et ce serait mieux si tu utilisais les fonctions password_xxx de PHP )
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  4. #4
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2011
    Messages
    754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2011
    Messages : 754
    Points : 376
    Points
    376
    Par défaut
    Bon,

    suivant vos indications, je n'ai toujours pas trouvé le problème, mais j'ai pu le régler en regénérant ma base de donnée.

    En farfouillant mon historique git j'ai pu voir qu'effectivement lorsque j'avais généré ma base la première fois j'avais doublement encodé...mais comme j'avais réglé l'erreur entre temps, sans regénérer la base...évidemment je ne trouvais pas la source

    Merci pour ces indications qui m'ont mis sur la piste


    Sinon, je prévois un double niveau d'encodage, d'où le md5 utilisé pour le moment qui ne sera que le premier niveau.

    J'avoue ne pas être fan des fonctions de crytage toute faite...aujourd'hui on vous dit que les fonctions password_xxx sont les plus performantes, mais il y a quelques années, l'on devait dire la même chose pour md5.

    Du coup, j'ai tendance à pensé que l'on a un cryptage plus sécurisé en utilisant un cryptage fait maison même si celui ci n'est pas aussi performant que ce que peut générer les fonctions password. Peut-être est-ce une mauvaise façon de penser.

    A titre de comparaison, c'est un peu comme certains virus qui sont développés pour s'attaquer à un antivirus particulier, paradoxalement on n'a moins de chance d'attraper ces virus là sans antivirus...je me fais donc la même idée pour le cryptage, si la méthode de cryptage n'est pas connu, le passage en force me parait bien plus compliqué.

  5. #5
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    Par défaut
    Citation Envoyé par Amnael Voir le message
    Du coup, j'ai tendance à pensé que l'on a un cryptage plus sécurisé en utilisant un cryptage fait maison même si celui ci n'est pas aussi performant que ce que peut générer les fonctions password. Peut-être est-ce une mauvaise façon de penser.
    Pour moi, c'est plutôt comme dire "les coffre-forts du marché sont connus, tout le monde utilise les mêmes. Je vais plutôt construire le mien".
    Deux résultats possibles :
    soit tu maitrises ce que tu fais et il sera plus facile de braquer la Réserve Fédérale de New York en sous-vêtements que de forcer ton coffre,
    soit tu n'as qu'une vague idée de ce que tu fais et ton coffre-fort ressemblera à la maison du 1er des 3 petits cochons.

    Personnellement, j’achèterais un coffre-fort.
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  6. #6
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2011
    Messages
    754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2011
    Messages : 754
    Points : 376
    Points
    376
    Par défaut
    Je suis censé avoir des cours de sécurité cette année, donc on va dire que je "devrais" savoir ce que je vais d'ici là ^^

  7. #7
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 235
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 235
    Points : 15 532
    Points
    15 532
    Par défaut
    Attention au vocabulaire que vous utilisez, il y a d'un côté les fonctions de chiffrement (qui permettent de déchiffrer) et les fonctions de hachage qui sont conçues pour ne pas pouvoir trouver le texte d'origine.

    La fonction MD5 était très utile dans le passé mais entre temps, des ordinateurs de plus en plus puissant on permit de montrer que cette fonction n'est plus si sure qu'on le pensait.
    PHP propose plusieurs méthodes de hachage :
    http://php.net/manual/fr/function.hash.php

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Cryptage de fichier
    Par :GREG: dans le forum Composants VCL
    Réponses: 6
    Dernier message: 18/12/2008, 09h43
  2. Cryptage de colonnes sous Oracle
    Par Julian Roblin dans le forum SQL
    Réponses: 9
    Dernier message: 28/11/2006, 18h24
  3. Cryptage
    Par Claythest dans le forum API, COM et SDKs
    Réponses: 3
    Dernier message: 04/06/2003, 15h20
  4. cryptage
    Par giminik dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 06/11/2002, 22h46
  5. Cryptage en C selon la méthode de césat
    Par shenron dans le forum C
    Réponses: 2
    Dernier message: 31/05/2002, 08h22

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo