Hasher un mot de passe convenablement

Ce topic a été résolu
TheFlameflo

TheFlameflo Le 6 avril 2016 à 02:43 (Édité le 25 janvier 2019 à 17:50)

Salut !
J'ai regardé le tuto de PrimFx qui permettait de créer un espace membre. Comment dans tout bon espace membre, on doit haser le mot de passe. Dans ce tuto, Prim utilise sha1() pour crypter le mot de passe. Mais j'ai vu récemment sur plusieurs forums qu'il est déconseillé de juste crypter un mot de passe avec sha1() car il est devenu facile d'attaquer par force brute la sortie de ces algorithmes pour retrouver la chaîne originale. source
Donc, je me demandais s'il est vraiment nécessaire de rajouter un grain de sel pour mieux le crypter.
Je ne suis pas sûr de comprendre le principe, cependant. (comment faire, etc)
Qu'en pensez-vous ?

PS: J'ai "inventé" une technique que je n'ai pas encore testé, mais j'aimerais avoir votre avis : si à l'inscription et à l'insertion dans ma BDD, pour mieux protéger le mdp, serait-il "mauvais" de double crypter mon mot de passe avec des algorithmes différents. 
Exemple :
md5(sha1($monmdp))
Est-ce une bonne idée où ça ne ferait que créer des erreurs et/ou prendre plus de temps à charger ?
quiqou55

quiqou55 Le 6 avril 2016 à 10:57 (Édité le 6 avril 2016 à 10:58)

Salut !
Actuellement la meilleur façon c'est d'utiliser B_CRYPT, tu peux l'utiliser grace a la fonction password_hash() de php et ensuite vérifier si le mot de passe correspond grace a password_verify() 😀

Attention: Cette fonction renvoi un hash différent pour le même mot de passe, il faut donc verifier le mot de passe avec la condition if et non where de MySQL 😀

Si tu veut en savoir plus je t'invite a voir le tuto de grafikart sur l'espace membre, il utilise cette fonction : https://www.grafikart.fr/tutoriels/php/gestion-membre-229
PrimFX

PrimFX Le 6 avril 2016 à 14:02

Salut !

Je ne connaissais pas la technique de @quiqou55 😋

Effectivement, étant donné que le hash en sha1() commence à voir avoir des failles (dictionnaires de plus en plus complets et précis), hasher en sha512 devient la façon la plus sécurisée d'hasher un mot de passe. Exemple: 
<?php

$mdp_hash = hash('sha512',$mdp);

?>
Pour rendre cela encore plus sécurisé, tu peux effectivement utiliser la technique du "grain de sel" qui consiste à rajouter une phrase ou un code à la suite du mot de passe avant de le hasher. Mais là encore, tu as deux possibilités (de la moins à la plus sécurisée):
  • Utiliser toujours le même grain de sel, autrement dit un code à la suite du mot de passe qui ne change pas.
  • Utiliser le pseudo de l'utilisateur ou encore une clé aléatoire (qu'il faudra donc sauvegarder dans la base de donnée) comme grain de sel
Au final, ton code ressemblera à ça:
<?php

$mdp_hash = hash('sha512',$mdp.$grain);

?>
Où $grain est la variable qui contient une des propositions ci-dessus (code, pseudo, etc.) :)

Par contre, à la connexion, il faudra faire attention à bien rajouter le grain de sel dans la vérification du mot de passe, sinon forcément, ça ne pourra pas fonctionner 😋
@+
julienb

julienb Le 6 avril 2016 à 20:39

Salut,
j'ai trouvé une librairie qui permet de crypter les mots de passe avec BCRYPT et qui s'adapte aux différentes versions de PHP, je vous donne le github:
https://github.com/ircmaxell/password_compat
A installer de préférence avec Composer.
TheFlameflo

TheFlameflo Le 6 avril 2016 à 21:38

Merci à vous tous pour avoir répondu à ma question . Mais comme j'avais demandé à la fin, je me demande si : 
PS: J'ai "inventé" une technique que je n'ai pas encore testé, mais j'aimerais avoir votre avis : si à l'inscription et à l'insertion dans ma BDD, pour mieux protéger le mdp, serait-il "mauvais" de double crypter mon mot de passe avec des algorithmes différents.  
Exemple : 
md5(sha1($monmdp)) 
Est-ce une bonne idée où ça ne ferait que créer des erreurs et/ou prendre plus de temps à charger ?
Encore merci, je vais bientôt modifier mon code pour renforcer la sécurité !
julienb

julienb Le 6 avril 2016 à 21:42

J'ai oublié : md5 et sha1 sont totalement obsolètes au niveau sécurité.
PrimFX

PrimFX Le 6 avril 2016 à 22:17

Salut !

Pour ton idée de double hacher le password, honnêtement, je me suis jamais posé la question x) Mais après avoir cherché un peu sur Google (et avoir trouvé des trucs dans ce genre), j'ai vu que de manière générale, oui ça augmente le temps de chargement, mais c'est aussi (un peu) plus sécurisé.

Par contre, le faire avec des algorithmes de hachage quasi obsolètes comme le md5 et le sha1 n'est pas forcément une bonne idée. Je pense que ça peut valoir le coup de le faire avec du sha512 ou un autre algorithme plus sécurisé qui t'a été proposé 😉

@julienb pour le coup je connais ni le BCRYPT ni la librairie que tu as partagé x) Faudrait que je teste 😋
TheFlameflo

TheFlameflo Le 6 avril 2016 à 22:31

Salut !

Je vais aller changer ça tout de suite (bien qu'il y a pas grande chance de me faire hack pour le moment, je développe en privé) !

Merci pour tout à tous !
Nobodief

Nobodief Le 7 avril 2016 à 05:35

Salut ! 

Je vais aller changer ça tout de suite (bien qu'il y a pas grande chance de me faire hack pour le moment, je développe en privé) ! 

Merci pour tout à tous !
La principal raison du hack provient des utilisateurs est non du développeur, à mon avis cela ne sert à rien de double hasher ton mot de passe (avec le même hash.).

Pour que cela soient vraiment sécurisé au point de décourager les hackers il faudrait hasher ton mot de passe 2 fois avec deux algorithmes différent si tu veux une réelle utilité à ton délire, hasher le mot de passe qui est hasher avec le même algorithme , c'est inutile.

Par contre si tu utilise plusieurs algorithmes, je pense que cela peut devenir intéressant, si tu utilise le sha512 puis ensuite le md5, ou même un nouveau hash, ouais la il auras une utilité.
guiguivey

guiguivey Le 27 mai 2016 à 11:39

Bien le bonjour tout le monde. Tout d'abord merci à toi PrimFX pour tout ce contenu de qualité, et merci à toutes les autres personnes qui contribuent à ce forum, c'est vraiment agréable de voir tout ce beau boulot. Je déterre un peu ce sujet car j'ai une question par rapport à la syntaxe à utiliser dans la connexion. Je n'arrive pas à l'articuler correctement (en effet je fais mes premiers pas en PHP).
Voici ce que j'ai mis pour le hashage au niveau de l'inscription :
   $mdp_hash = hash('sha512',$mdp.$grain);
   $mdp2_hash = hash('sha512',$mdp2.$grain);
Ça prend bien en compte l'enregistrement dans ma BDD. Par contre, lorsque j'essaye de me connecter, cela ne fonctionne plus, voici le bout de code que j'ai mis :
   $mdpconnect.$grain = sha512($_POST['mdpconnect']);
Je vous remercie d'avance pour vos réponses et je vous souhaite de passer une agréable journée.
Florian

Florian Le 27 mai 2016 à 15:16

SHA512 pas recommander dans quelque année il va faire comme sont cousin le SHA1 et le SHA256 decrypter facilement le mieux c'est comme on l'a dit au dessis c'est le B_crypt un pti tuto https://www.grafikart.fr/tutoriels/php/gestion-membre-229 c'est beaucoup plus sécuriser que le SHA/MD
Vous devez être connecté pour poster une réponse. Se connecter ou Créer un compte