|
Publicité ' | ||||||||||||||||||||||||
|
|
#1 | ||||
![]() ![]() Olivier Développeur Web Inscription : août 2003 Messages : 2 499 ![]() |
La RFC "password_hash" vient d'être acceptée et sera ajoutée à PHP 5.5
Pourquoi cette nouvelle API ? Généralement lorsque l'on parle de hash de mot de passe les utilisateurs se tournent vers md5 ou sha, deux algorithmes qui ne devraient plus être utilisés (nombreuses rainbow tables, failles dans l'algorithme ...) Une solution efficace pour hasher ses mots de passe est l'utilisation de bcrypt mais malheureusement peu de développeurs l'utilisent notamment à cause de la fonction crypt() de php qui n'est pas des plus faciles à utiliser. Cette nouvelle API vient donc combler ce manque avec une solution simple et efficace pour protéger ses mots de passe. Comment ça marche ? La RFC propose quatre nouvelles fonctions, deux nous intéressent particulièrement puisqu'elles permettent de hasher et vérifier un hash : Code :
Code :
Avec cette API, plus besoin de se soucier des salts aléatoires, tout est géré en interne, le développeur n'a plus qu'à protéger son mot de passe. La compatibilité future n'a pas été oubliée puisque grâce à password_needs_rehash il sera possible de rehasher un mot de passe si l'algorithme par défaut évolue. Je n'ai pas PHP 5.5 ! Tout n'est pas perdu Toutes les infos et des exemples sur la RFC password_hash : voir
__________________
Pry Framework php5 | Recherche CDI dev. Web sur Dijon et alentours. |
||||
|
60
|
|
|
#2 |
|
Expert Confirmé
![]() Baptiste ROUSSELDéveloppeur Temps réel Embarqué Inscription : janvier 2011 Messages : 1 297 ![]() |
Sympatoche, jusqu'à maintenant j'utilisais ma propre class effectuant la même chose mais en utilisant blowfish.
Mais sinon je vois pas tellement en quoi crypt() est difficile à utiliser... Edit : hum... BCRYPT = BLOW_FISH ? ![]() Bon au final à part normaliser ce que j'utilisais déjà ça me changera rien...
__________________
|
|
|
00
|
|
|
#3 | |
![]() ![]() Olivier Développeur Web Inscription : août 2003 Messages : 2 499 ![]() |
Citation:
Là avec cette nouvelle API , pas de question à se poser , pas besoin de connaitre les différents algorithmes. Bref c'est plus simple et on évite les erreurs
__________________
Pry Framework php5 | Recherche CDI dev. Web sur Dijon et alentours. |
|
|
00
|
|
|
#4 |
|
Candidat au titre de Membre du Club
![]() Yann KechichianDéveloppeur Web Inscription : août 2010 Messages : 16 ![]() |
Il existe même une librairie qui permet d'assurer la compatibilité avec les versions antérieures à la 5.5 : https://github.com/ircmaxell/password_compat
|
|
|
00
|
|
|
#5 |
|
Nouveau Membre du Club
![]() Inscription : mars 2007 Messages : 16 ![]() |
Je comprend pas comment le salt peut être géré en interne ?
C'est une chaîne qu'on définis dans le php.ini ? En cas de changement de serveur comment ça se passe pour conserver le même grain ? Et la fonction password_verify() elle fait juste un password_hash($password) puis un === ou bien c'est plus complexe que ça ? |
|
|
00
|
|
|
#6 |
![]() ![]() ![]() Nathanael MarchandExpert .Net So@t Inscription : octobre 2008 Messages : 3 520 ![]() |
Il manque une parenthèse dans le dernier exemple, juste avant le point virgule : ("cost" => 10);
Par contre, j'ai du mal à voir comment password_verify fonctionne. En supposant que password_hash est paramétrable (puisqu'on a l'air de pouvoir passer l'algo et la complexité), je vois pas comment on peut faire la comparaison pour savoir si le password est bon car il faut réhasher avec les mêmes paramètres et comparer ceci or password_verify lui ne prend pas de paramètres. Si quelqu'un peut éclairer ma lanterne ca serait top!
__________________
Retrouvez moi sur : |
|
10
|
|
|
#7 |
|
Membre éprouvé
![]() Inscription : décembre 2004 Messages : 362 ![]() |
J'imagine que la valeur du hash contient quelques infos sur la manière dont il a été calculé, permettant de vérifier par la suite ?
Ou bien il existe, parallèlement à l'algo de chiffrage, un algo de vérif qui profite de quelques particularités mathématiques de la méthode de chiffrage ?
__________________
L'avis publié ci-dessus est mien et ne reflète pas obligatoirement celui de mon entreprise. |
|
|
10
|
|
|
#8 | ||
|
Membre éclairé
![]() Mathieu SavelliDéveloppeur Web Inscription : février 2009 Messages : 75 ![]() |
La chaine retournée par password_hash() contient à la fois le l'algo + l'indice de complexité + le sel + le hash.
Code :
Et oui, pour effectuer la comparaison, on repasse le mot de passe en clair à la moulinette et on le compare au hash. Les informations de cryptage (algo, complexité et sel) sont extraites de la chaine du hash. |
||
|
|
30
|
|
|
#9 | |
![]() ![]() Olivier Développeur Web Inscription : août 2003 Messages : 2 499 ![]() |
Citation:
Grabeuh l'explique très bien dans sa réponse précédente , le hash retourné par la fonction comprend toutes les infos nécessaire pour le comparer. Pour ceux que ca interesse une implémentation de bcrypt en php : https://github.com/grunk/Pry/blob/ma...rypt.class.php ca peut aider à comprendre le principe
__________________
Pry Framework php5 | Recherche CDI dev. Web sur Dijon et alentours. |
|
|
10
|
|
|
#10 | ||
|
Membre du Club
![]() Développeur Web Inscription : septembre 2011 Messages : 47 ![]() |
Donc si je comprend bien, avec cette nouvelle méthode, en BDD on stocke à la fois l'algo + l'indice de complexité + le sel + le hash.
Mais si une personne mal intentionnée récupére ma BDD et même si elle a toute ces infos, il lui sera impossible de déchiffrer et de retrouver le mot de passe en clair ? Pour ma part, j'ai toujours stocké le hash dans la BDD et le sel dans mon code source... N'est-ce pas mieux ainsi ? Et que pensez-vous de la solution : Code :
|
||
|
|
00
|
|
|
#11 | |
![]() ![]() ![]() Nathanael MarchandExpert .Net So@t Inscription : octobre 2008 Messages : 3 520 ![]() |
Citation:
__________________
Retrouvez moi sur : |
|
|
00
|
|
|
#12 | |
![]() ![]() Olivier Développeur Web Inscription : août 2003 Messages : 2 499 ![]() |
Citation:
Après ca ne protège pas des utilisateurs négligents qui utilisent des mdp du genre "azerty" ou "123"
__________________
Pry Framework php5 | Recherche CDI dev. Web sur Dijon et alentours. |
|
|
00
|
|
|
#13 | |
|
Nouveau Membre du Club
![]() Inscription : mars 2007 Messages : 16 ![]() |
Merci pour les infos
![]() ça me semble très sympa comme méthode de fonctionnement, je vais étudier ça d'un peu plus près. Citation:
Si tu utilise un grain de sel différent à chaque fois il faudra tester tous les mots de passe possible pour chaque utilisateur et ça sera beaucoup trop long pour être faisable. Après l'idée de stocker le grain de sel à autre endroit de la BDD ne me semble pas complètement idiot car ce n'est pas rare que la BDD soit piraté mais pas le code source de l'application. Une solution qui combine tous les avantages c'est de faire un truc du genre $hash = md5('GDS_Code_Source' . $user['gds_bdd'] . $password); Comme ça le pirate doit avoir accès a la BDD + au code source et il ne pourra même pas se créer de raimbow table vu qu'il y'a un grain de sel par compte. |
|
|
|
00
|
|
|
#14 |
|
Invité régulier
![]() |
Je suis étonné que les clés du tableau d'option ne soient pas des constantes.
|
|
|
00
|
|
|
#15 |
![]() ![]() |
Si je comprend bien, plutôt que d'envoyer le hash de son mot de passe, le client va envoyer son mot de passe au serveur afin que ce dernier puisse recalculer le hash ?
Je ne suis pas expert en sécurité mais ça veut dire qu'à un moment ou un autre, le serveur est capable de retrouver le mot de passe en clair et je doute que ce soit une bonne chose... non?
__________________
Recherche devs C++ motivés et sérieux pour Last Dungeon. Chaîne Youtube : Vidéos Ma page DVP : http://neckara.developpez.com/ |
|
|
00
|
|
|
#16 | |
|
Membre confirmé
![]() Mathieu Le LuëtIngénieur développement logiciels Inscription : novembre 2010 Messages : 150 ![]() |
Citation:
__________________
Pensez au et un petit vote si mon post vous a été utile .
|
|
|
00
|
|
|
#17 | ||
|
Membre éclairé
![]() Mathieu SavelliDéveloppeur Web Inscription : février 2009 Messages : 75 ![]() |
Citation:
La première chose qu'on apprend en sécurité, c'est qu'il ne faut JAMAIS faire confiance au client. Les données malicieuses, intentionnelles ou non, viennent dans 99% des cas du client. Tu as la main sur le code qui est situé sur ton serveur et si ton application est compromise de l'intérieur, tu es en mesure de réagir. Par contre, tu ne sais pas qui est ton client ni comment il agit car le protocole HTTP fait que tu n'as que les informations qu'il veut bien te donner, et ces informations peuvent de toute façons être falsifiées. Encoder le mot de passe côté client revient à considérer comme des faits des suppositions impossibles à vérifier, ou alors qui te demanderont de gérer plusieurs cas selon que le mot de passe sera envoyé en clair ou en hashé et donc compliquera inutilement ton travail de développeur :
Les seuls moyens suffisamment efficaces à ce jour de se protéger contre les attaques man in the middle sont une connexion sécurisée type SSL et une sensibilisation des utilisateurs aux questions de sécurité des applications web. Pour rendre ceci encore plus efficace, une authentification forte à 2 facteurs : ajouter au mot de passe un code à usage unique et limité dans le temps envoyé par SMS, par une clé type RSA SecurID ou encore par une application spécifique pour smartphone. Si le voleur a le mot de passe, il n'aura pas l'élément physique nécessaire à l'attaque et pourra difficilement automatiser l'attaque à cause du laps de temps de validité du code. Mais comme toujours, sécurité et facilité d'utilisation sont généralement antagoniste, et plus on rajoute des couches pour protéger son site, plus on le rend fastidieux à utiliser (et surtout compliqué à maintenir) Et surtout, aucune sécurité n'est inviolable, car tout programme informatique est contournable, soit par un autre programme, soit par ingénierie sociale. Citation:
S'il veut le voler pour l'utiliser ailleurs (vu que la plupart des gens utilisent le même mot de passe un peu partout, de leur compte facebook à leur banque en ligne) , pourquoi attendre que l'utilisateur retape son mot de passe une nouvelle fois ? Il enregistrera la version en clair dès la création du compte. S'il veut usurper l'identité d'un utilisateur sur son propre site, il n'a qu'à modifier le mot de passe et lui donner la valeur qu'il veut, et ensuite remettre l'ancien hash à la place, ni vu ni connu. De toute façons, il faut bien qu'à un moment, le serveur puisse faire la comparaison. Et comme je l'a dit plus haut, le client n'est pas digne de confiance. C'est donc forcément au serveur de s'occuper de rehasher le mot de passe pour pouvoir la faire. Car tu es seul à avoir la main dessus (du moins, en théorie) est tu es donc capable de juger de la confiance que tu peux accorder à ton propre code. |
||
|
|
30
|
|
|
#18 |
![]() ![]() |
Je sais qu'il ne fait jamais faire confiance au client, mais dans ce cas là envoyer le hash ou le mot de passe revient au même niveau sécurité.
Pour les spécificités côtés clients hors navigateur utilisés (JavaScript activé ou non, etc.), personnellement je ne m'en occuperais pas (juste mettre un petit message) quitte à perdre une petite partie du public (bon après je ne suis pas professionnel).Mais rien ne dit que le JavaScript n'est pas obligatoire pour l'utilisation du site ou que le client utilise bien du JavaScript (ex : client en C++). Mais dans mon raisonnement, je pensais que d'envoyer le hash plutôt que le mot de passe réduit le "moment" où il serait possible (mais très faiblement probable) de retrouver le mot de passe. De plus comme on ne peut jamais garantir une sécurité à 100%, si jamais une faille est découverte, le mot de passe n'est pas mis en danger.
__________________
Recherche devs C++ motivés et sérieux pour Last Dungeon. Chaîne Youtube : Vidéos Ma page DVP : http://neckara.developpez.com/ |
|
|
10
|
|
|
#19 |
|
Membre Expert
![]() ![]() Inscription : janvier 2006 Messages : 1 626 ![]() |
je me souviens que j'avais écrit un systeme de échange de mdp "sécurisé" (lol) sur du http avec un nomus pour vérifier la formule hash(hash(password) xor nomus) en provenance d'une lib js du client. Pas de mdp stocké en clair, et pas de mdp qui circulent en clair. la sécu s'arrêtait là.
parce qu'envoyer simplement le hash sur le réseau fait que l'on transforme une empreinte avec un super niveau d'entropie en un mot de passe en clair de longueur fixe. on ne doit envoyer que des "transformés" le réseau. Celui qui comprends pas qu'un hash peut être bruteforcé ou rejoué... est une proie.
__________________
PHP fait nativement la validation d'adresse électronique Celui qui a inventé mysql_connect(...) or die() est déjà mort plusieurs fois. Soyez moderne: mysqli_connect() or throw Exception(mysqli_connect_error()); PHP: un problème ? décrivez le avec ceci. Utilisez le bouton résolu! |
|
|
00
|
|
|
#20 |
|
Invité régulier
![]() Inscription : janvier 2008 Messages : 10 ![]() |
Ce qu'il ne faut pas lire quand même... la cryptographie, ça ne s'improvise pas. Je recommande la lecture de "Applied Cryptography" et de "Secret and Lies" de Schneier pour éviter de raconter des bêtises à ce sujet
MD5 (et encore davantage SHA1) n'ont aucun problème de sécu à ce jour pour ce qui est de leur utilisation pour le hachage de mot de passe. La dernière cryptanalyse dont j'ai science sur les attaques par pré-image (retrouver un antécédant à un condensat) était de l'ordre de 2^123, alors qu'on peine à atteindre (en fait, on en est loin) les 2^100 en terme depuissance de calcul. Ce n'est pas le cas de leur usage lorsqu'il y a risque d'attaques par *collision*, qui est ce jour considéré comme triviales pour MD5. Hacher le mot de passe coté client est inutile : le secret n'est plus le mot de passe, mais son condensat : apport en capacité d'authentification : zéro-toto. De toutes les manières, si la sécu vous importe sur votre mécanisme d'auth (et elle devrait), utilisez TLS. On peut avoir des certificats pour 0 à 15 euros par an, qui suffisent amplement pour un petit site perso. Se substituer à TLS est TOUJOURS une mauvaise idée. Concernant le salt : n'utilisez jamais de sel constant sur plusieurs utilisateurs. Un par user. Privilégiez des salts vraiment aléatoires (pas rand(om)(), donc). Prévoyez un salt qui complète la taille du bloc de votre algo de hachage, au mini, et mieux un salt qui fasse au moins la taille du bloc (les tailles de blocs sont dispos dans toute bonne doc sur les-dits algo). Idéalement, faites un open de urandom sur les systèmes unix, voire de /dev/random si vous avez un générateur d'entropie à disposition (je ne parle pas de votre femme, messieurs :p) : le PRNG de PHP a été prouvé maintes fois peut fiable : autant l'éviter comme la peste pour la crypto. "Mais pour qui il se prend, celui là ?" Pour qqn qui fait ça à longueur de journée, de se renseigner, lire et se former pour donner les meilleurs conseils sécu à ses clients |
|
|
21
|
Copyright © 2000-2013 - www.developpez.com