7713 sujets

Développement web côté serveur, CMS

Bonjour,
Je me tourne vers la communauté pour avoir un conseil, je souhaite connaitre la meilleur méthode pour hasher un password dans une bdd ?
Vous utiliser quoi comme méthode ?
Merci d'avance, pour vos retours.
Smiley smile
Modifié par Tintin75 (06 Aug 2018 - 15:38)
Hello Tintin !

C'est une question qui mérite vraiment d'être posée. J'imagine que le terme "meilleur" désigne ici "sécurisé". Dans ce cas, oublie les algorithmes MD5 et SHA-1 qui étaient beaucoup utilisés mais qui sont devenus obsolètes (SHA-1 y'a pas si longtemps que ça au passage).

Il existe une nouvelle famille d'algorithmes appelée SHA-2 pour succéder à SHA-1, qui contient notamment SHA-256 que tu peux utiliser sans problème. Dans tous les langages tu devraient trouver des librairies qui te permettent de hasher tes mots de passe avec cet algorithme, si c'est pas déjà supporté nativement comme en PHP.

En espérant avoir répondu à ta question.
Merci, c'est juste pour faire un tour d'horizon, des méthodes utilisés par les membres du forum.
Je te remercie, de ta réponse. Smiley biggrin
Ouai ouai... quand même on peut faire des chose en combinant les méthodes soit disant obsolètes.
Par exemple dans une classe d'utilitaires, j'utilise une fonction de ce genre pour hasher mes mots de passe.
Là, franchement, celui qui arrivera à déchiffrer ça, je lui paye un Orangina Smiley smile


	public static function hashPassword($p) {
		define("SALT", "<b}DKJ{]1QIcgsl<-Ksp#ybnaP!{M@jlncCVntjhyEaN*WjhdfJXZ");
		return sha1(SALT . md5($p . SALT) . sha1(SALT));
	}


Modifié par lionel_css3 (08 Aug 2018 - 10:58)
@lionel

C'est une très mauvaise pratique, il faut en général éviter la bouillie de hash sans être un spécialiste en cryptographie:
1) Cela peut éventuellement affaiblir au final le hash en augmentant les collisions.
2) Si l'attaquant a accès à ta db il y a de fortes chances qu'il accède à ton code source aussi.
3) La sécurité de ton ton code est en fait à peu près celle de l'algorithme le plus fort (sha1)
4) Un sel statique ne protège pas ceux qui partagent un même mot de passe (ou une collision) et est à éviter

Certes sha1 est «cassé» mais pour le faire il faut une certaine puissance de calcul que seuls quelques puissances peuvent déployer, pour le moment.

Voici un code simplissime qui utilise BCRYPT et un sel aléatoire, et qui est des millions de fois plus sécure (alors pourquoi s'en priver?):


$hash = password_hash("rasmuslerdorf", PASSWORD_DEFAULT);

// donne $2y$10$.vGA1O9wmRjrwAVXD98HNOgsNpDczlqm3Jq7KnEd1rVAGv3Fykk1a


Et pour décoder:

if (password_verify('rasmuslerdorf', $hash)) {
    echo 'Le mot de passe est valide !';
} else {
    echo 'Le mot de passe est invalide.';
}


http://php.net/manual/fr/function.password-hash.php
http://php.net/manual/fr/function.password-verify.php
Meilleure solution
@kustolovic, merci pour l'info, je ne connaissais pas ces deux nouvelles fonctions....
Modifié par lionel_css3 (08 Aug 2018 - 15:20)