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 :

Sécurité mot de passe (hash)


Sujet :

Langage PHP

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2012
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Juillet 2012
    Messages : 28
    Points : 28
    Points
    28
    Par défaut Sécurité mot de passe (hash)
    Bonjour,
    Des fonctions très pratiques pour hasher et comparer les mots de passe existent sous PHP5.5 mais je suis sous PHP5.4.
    La fonction crypt() fonctionne et je compte l'utiliser de la façon suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $user_input = 'mypassword'; // vient normalement du $_POST['mdp']
    $mdp_en_bdd = '$1$sD0.F1/.$smvGb4Kn.Pz8xa3WTlRVY1'; // hash enregistré dans la BDD
    $hashed_password = crypt($user_input);
    if ($mdp_en_bdd === crypt($user_input, $mdp_en_bdd)) {
       echo "Mot de passe correct !";
    } else {
       echo "PB";
    }
    Je constate que ça marche mais j'ai plusieurs remarques :
    - ce code est-il bel et bien sécurisANT ?
    - j'utilise crypt() à deux reprises, une fois avec un seul argument, et une fois avec deux arguments ; je ne comprends pas le second argument (sa présence, son rôle)
    - j'ai essayer de comprendre les sels, mais rien n'est clair pour moi (serait-ce d'ailleurs le second argument ?)
    - Je ne trouve rien sur le web avec "crypt+PHP5.4" ; suis-je si seul que cela à avoir ce problème, ou tout du moins ce besoin ?
    Par avance merci pour vos expertises.
    Gilles

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Membre émérite

    Profil pro
    Inscrit en
    Mai 2008
    Messages
    1 576
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 1 576
    Points : 2 440
    Points
    2 440
    Par défaut
    N'essaie pas de faire de la crypto si tu n'as pas les connaissances pour. S'il y a un domaine où il ne faut pas faire d'à peu près, c'est bien celui-là.

    Utilise la librairie password_compat qui te permet de disposer des password_hash() et password_verify sur PHP 5.4

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2012
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Juillet 2012
    Messages : 28
    Points : 28
    Points
    28
    Par défaut
    OK, j'ai testé la lib "password_compat" avec ce code qui donne de bons résultats (ça marche) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    require "password_compat.php"; // appel de la librairie "password_compat"
    $password = 'coco';
    $hash = password_hash($password, PASSWORD_DEFAULT, array('cost'=>14));
    $hash2 = '$2y$14$NgGwL4ZhVmLPuPOHmySa6uc/ReqgGzNSDzKELY1kALBJIvQ.8VGFm'; // le hash de coco
    if (password_verify($password, $hash2)) {
        echo "OK";
    } else {
        echo "PAS OK";
    }
    Quelques questions :
    - avec password_hash(), je n'ai pas besoin de stocker le sel quelque part ; vrai ?
    - il est judicieux de définir le coût sois-même ; vrai ?
    - un VARCHAR(60) en BDD est bien ou faut prévoir un peu plus ?
    - j'ai intérêt à remplacer PASSWORD_DEFAULT par CRYPT_BLOWFISH. ; vrai ?
    Merci.

    Lien utile : http://blog.pascal-martin.fr/post/ph...-de-passe.html

  5. #5
    Membre émérite

    Profil pro
    Inscrit en
    Mai 2008
    Messages
    1 576
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 1 576
    Points : 2 440
    Points
    2 440
    Par défaut
    Citation Envoyé par GillesV Voir le message
    Quelques questions :
    - avec password_hash(), je n'ai pas besoin de stocker le sel quelque part ; vrai ?
    Vrai. Le sel est stocké avec le hash du mot de passe.

    Citation Envoyé par GillesV Voir le message
    - il est judicieux de définir le coût sois-même ; vrai ?
    Tout dépend de la valeur que tu mets :-) Plus la valeur est élevée, mieux c'est, mais plus ça prends du temps et demande des ressources

    Citation Envoyé par GillesV Voir le message
    - un VARCHAR(60) en BDD est bien ou faut prévoir un peu plus ?
    Si tu choisis PASSWORD_DEFAULT comme algorithme, la doc conseille de prévoir 255 caractères, tout simplement parce que dans des futures versions d'autres algorithmes seront peut-être utilisés, et ça entraînera peut-être une augmentation de la longueur du hash.

    Citation Envoyé par GillesV Voir le message
    - j'ai intérêt à remplacer PASSWORD_DEFAULT par CRYPT_BLOWFISH. ; vrai ?
    Faux. Pour le moment, PASSWORD_DEFAULT est égal à PASSWORD_BCRYPT (qui utilise CRYPT_BLOWFISH), donc il n'y a pas d'intérêt particulier. En le laissant à PASSWORD_DEFAULT, tu profiteras automatiquement d'un meilleur algorithme le jour où il sera ajouté. Et pas de souci pour les hash déjà stockés: chaque hash contient l'algorithme utilisé, donc password_verify() fonctionnera sans problème.

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2012
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Juillet 2012
    Messages : 28
    Points : 28
    Points
    28
    Par défaut
    Deux choses à dire :
    1) Je mets VARCHAR(255)
    2) merci à tous.

  7. #7
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 380
    Points : 10 410
    Points
    10 410
    Par défaut
    Salut,

    Pour le cost tu peux t'inspirer de l'exemple 4 de la fonction password_hash et l'adapter pour crypt pour trouver les meilleures valeurs pour ton serveur.
    Tu peux aussi choisir un coût différent suivant les utilisations, par exemple standard pour un forum ou espace public et très élevé pour une partie admin car dans ce dernier cas même si le serveur rame un peu ce n'est pas important puisqu'il ne sera pas souvent sollicité.

  8. #8
    Nouveau membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2012
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Juillet 2012
    Messages : 28
    Points : 28
    Points
    28
    Par défaut
    Mon site web est une application (un cloud computing) qui est nécessairement accessible par une page d'identification.
    En local chez moi, la fonction de recherche du coût idéal me donne 9 ; je laisserais bien 14, mais je me demande si ça peut générer un effondrement du serveur (une fois en prod) en cas de (trop) nombreuses connexions sur un temps donné (je suis actuellement sur un mutualisé), ou si certains vont devoir patienter plus de quelques secondes, ce qui n'est pas génial...

  9. #9
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 380
    Points : 10 410
    Points
    10 410
    Par défaut
    Et pourquoi ne fais-tu pas le test en conditions réelles d'utilisation, c'est à dire sur ton serveur mutualisé ?

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 21/01/2017, 08h26
  2. [Sécurité] [login membre] mot de passe hashé
    Par july dans le forum Langage
    Réponses: 24
    Dernier message: 02/06/2006, 15h19
  3. [Sécurité] mot de passe cryptée?
    Par kevinf dans le forum Langage
    Réponses: 8
    Dernier message: 01/11/2005, 14h02
  4. [FireFox / Sécurité] Mots de passe en clair
    Par arcane dans le forum Applications
    Réponses: 6
    Dernier message: 28/12/2004, 17h28
  5. Réponses: 4
    Dernier message: 29/11/2004, 22h53

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