Hasher un mot de passe convenablement
- Accueil
- Forum
- Programmation
- PHP
- Hasher un mot de passe convenablement
Ce topic est suivi par : quiqou55, PrimFX, Nobodief, guiguivey
TheFlameflo Le 6 avril 2016 à 02:43 (Édité le 25 janvier 2019 à 17:50)
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 Le 6 avril 2016 à 10:57 (Édité le 6 avril 2016 à 10:58)
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 Le 6 avril 2016 à 14:02 (Édité le 1 janvier 1970 à 01:00)
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
<?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 Le 6 avril 2016 à 20:39 (Édité le 1 janvier 1970 à 01:00)
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 Le 6 avril 2016 à 21:38 (Édité le 1 janvier 1970 à 01:00)
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.Encore merci, je vais bientôt modifier mon code pour renforcer la sécurité !
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 ?
julienb Le 6 avril 2016 à 21:42 (Édité le 1 janvier 1970 à 01:00)
PrimFX Le 6 avril 2016 à 22:17 (Édité le 1 janvier 1970 à 01:00)
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 Le 6 avril 2016 à 22:31 (Édité le 1 janvier 1970 à 01:00)
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 Le 7 avril 2016 à 05:35 (Édité le 1 janvier 1970 à 01:00)
Salut !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.).
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 !
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 Le 27 mai 2016 à 11:39 (Édité le 1 janvier 1970 à 01:00)
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 Le 27 mai 2016 à 15:16 (Édité le 1 janvier 1970 à 01:00)