Question:
Hachage de mot de passe côté client
Foy Stip
2012-10-23 05:47:19 UTC
view on stackexchange narkive permalink

Modifier : mise à jour pour mettre davantage l'accent sur l'objectif - la tranquillité d'esprit pour l'utilisateur, et non le renforcement de la sécurité.

Après en lisant quelques discussions ici sur le hachage des mots de passe côté client, je me demande toujours si cela pourrait être correct de l'utiliser dans une situation particulière.

Plus précisément, j'aimerais avoir le client - un programme Java - hacher leur mot de passe en utilisant quelque chose comme PBKDF2, en utilisant comme sel une combinaison de leur adresse e-mail et d'un bloc d'octets constant spécifique à l'application . L'idée étant que le hachage est reproductible pour l'authentification, mais, espérons-le, pas vulnérable aux attaques de rétro-ingénierie (pour découvrir le mot de passe littéral) autres que la force brute si les données du serveur sont compromises.

Objectif:

Le hachage côté client est pour la tranquillité d'esprit de l'utilisateur que son mot de passe littéral n'est jamais reçu par le serveur, même s'il y a quand même l'assurance de le hacher dans le stockage. Un autre avantage secondaire (ou peut-être une responsabilité?) Est que le coût de hachage d'un PBKDF2 itéré ou similaire incombe au client.

Les caractéristiques de l'environnement sont:

  • Toutes les communications client-serveur sont cryptées.
  • Les messages rejoués ne sont pas autorisés. c'est à dire. le hachage envoyé par le client ne peut pas être utilisé efficacement comme mot de passe par un espion.
  • L'interdiction temporaire et la mise sur liste noire des adresses IP sont possibles pour plusieurs tentatives de connexion infructueuses dans un court laps de temps. Cela peut être par compte utilisateur ou à l'échelle du système.
  • Problèmes:

    1. "Évitez de concevoir des schémas d'authentification maison."
    2. Le sel est déterministe pour chaque utilisateur, même si les hachages produits seront spécifiques à cette application à cause des octets supplémentaires (identiques) jetés dans le sel. Est-ce mauvais?
    3. Les authentifications côté serveur se produiront sans retard significatif, sans frais de hachage. Cela augmente-t-il la vulnérabilité aux attaques d'authentification par force brute distribuée?
    4. Les clients non fiables peuvent fournir un hachage faible pour leurs propres comptes. En fait, pas trop inquiet à ce sujet.
    5. Le serveur devrait-il répéter les hachages du client avant de les stocker?

    Pensées?

    Je pense que je suis un peu confus au sujet du modèle de menace. Quelle est la menace contre laquelle cela défend. Le mot de passe est-il stocké sur le serveur? Sinon, le jeton est passé du client au serveur _est_ le mot de passe. Si ce n'est pas le cas, comment empêcher les attaques de relecture. Je vois des choses que j'aime ici, mais je ne peux pas évaluer le schéma sans comprendre le modèle de menace.
    Désolé, j'aurais vraiment dû mettre l'accent sur le troisième ... maintenant le quatrième paragraphe de plus, qui décrit l'objectif de ceci par rapport à un schéma plus conventionnel: la tranquillité d'esprit pour l'utilisateur du serveur ne recevant pas son mot de passe littéral. Le fait de ne pas avoir à effectuer un hachage PBKDF2 coûteux effectué sur n itérations est un bonus (bien que, comme l'a souligné un poster, cela pourrait également ajouter une défense contre DOS). Cependant, je n'essaie pas de répondre à un modèle de menace spécifique autre que l'habituel.
    Sept réponses:
    David Wachtfogel
    2012-10-23 09:54:22 UTC
    view on stackexchange narkive permalink

    Le hachage côté client ne résout pas le principal problème que le hachage de mot de passe est destiné à résoudre - ce qui se passe si un attaquant accède à la base de données de mots de passe hachés. Étant donné que les mots de passe (hachés) envoyés par les clients sont stockés tels quels dans la base de données, un tel attaquant peut se faire passer pour tous les utilisateurs en envoyant au serveur les mots de passe hachés de la base de données tels quels.

    D'autre part Par contre, le hachage côté client est agréable en ce qu'il garantit à l'utilisateur que le serveur n'a aucune connaissance du mot de passe - ce qui est utile si l'utilisateur utilise le même mot de passe pour plusieurs services (comme le font la plupart des utilisateurs ).

    Une solution possible pour cela est le hachage à la fois du côté client et du côté serveur. Vous pouvez toujours décharger la lourde opération PBKDF2 sur le client et effectuer une seule opération de hachage (sur le mot de passe haché PBKDF2 côté client) côté serveur. Le PBKDF2 dans le client empêchera les attaques par dictionnaire et l'opération de hachage unique côté serveur empêchera d'utiliser les mots de passe hachés d'une base de données volée tels quels.

    Vous avez raison, il y a la raison impérieuse de refaire le hachage sur le serveur: si un attaquant obtient une copie de la base de données sans nécessairement avoir accès en écriture, si je vous comprends bien. Sur la base des réponses des autres jusqu'à présent, je me méfie toujours de la viabilité de tout ce système, mais pour le moment, il semble que la combinaison d'un hachage lourd sur le client et d'un re-hachage final sur le serveur semble prometteuse. Merci pour la réponse.
    Autre raison de hacher côté client? Si quelqu'un veut automatiser la connexion et les tâches de routine sur votre application (par exemple, dans un travail `cron`), si vous n'utilisez pas de hachage, il doit stocker le mot de passe quelque part sur le lecteur en texte brut. Bien sûr, ils pourraient le chiffrer, mais ils devraient ensuite être là pour saisir la clé de chiffrement, ce qui représente le même niveau d'inconvénient.
    Et l'argument contre le hachage côté client - qu'il ne résout pas le problème résolu par le hachage côté serveur - est spuriouis. La couche de hachage côté client peut être transparente et n'affecter aucun aspect du backend. Tout ce que fait le hachage côté client, c'est rendre la vie d'Eve plus difficile, à un coût minime pour l'utilisateur final.
    Bon sang, on pourrait même faire une seule itération de MD5 sur le client et être en sécurité.Avec un hachage entièrement aléatoire provenant du client, vous allez avoir un énorme espace de recherche côté serveur à rehash.Même le MD5 ultra-rapide prendra encore beaucoup de temps pour rechercher tout cet espace.
    @JasonCoyne Si le client ne fait qu'un seul MD5 et que le serveur ne fait qu'un autre hachage MD5 unique sur le résultat, un attaquant qui accède au mot de passe haché DB du serveur peut faire une attaque simple (même en supposant du sel).Pour chaque mot de passe haché dans la base de données, prenez les mots de passe les plus courants, hachez-les deux fois et comparez-les au mot de passe haché de la base de données.Même si vous prenez les 10 millions de mots de passe les plus populaires, cela prendra moins d'une seconde pour s'exécuter sur chaque mot de passe haché dans la base de données.
    Je me demande pourquoi ce n'est pas du bon sens, je veux dire que les navigateurs devraient envoyer des alertes lorsque vous envoyez une entrée de mot de passe en texte brut.Et si je ne fais pas confiance à xyz.com?Je veux dire que j'utilise déjà des mots de passe aléatoires, mais la plupart des gens ont 3 mots de passe et des mots de passe prudents 4.
    @DavidWachtfogel N'assumez jamais un client en particulier.Si vous déchargez le hachage lourd sur le client, les attaquants avec du matériel spécialisé auront du mal à le faire, et les utilisateurs avec un matériel médiocre auront du mal.Exactement le contraire de ce que vous voulez.Le hachage costaud devrait être sur le serveur puisque vous savez que le matériel et le hachage rapide et rassurant devraient être sur le client.
    Le hachage n'est pas la bonne façon de protéger les informations d'identification.Le cryptage est.Si vous effectuez un hachage pur sur le client, un attaquant n'obtiendra pas le mot de passe en texte clair, mais il pourra quand même effectuer une attaque de relecture.Vous auriez besoin d'au moins un sel spécifique à la session dans le hachage pour empêcher les attaques de relecture, que l'on pourrait appeler une forme faible de cryptage (unidirectionnel).Mais mieux vaut opter pour un cryptage approprié.Quels SSL / TLS / HTTPS / IPSec sont censés vous donner.
    Il faut encore utiliser du sel côté serveur.
    Motoma
    2012-10-23 18:42:19 UTC
    view on stackexchange narkive permalink

    Il y a peu de temps où le hachage côté client en vaut la peine. Une telle circonstance est lorsque le processus de hachage est intensif en calcul, ce qui peut être le cas avec PBKDF2.

    Répondre à vos préoccupations:

    1. Évitez suggestions non validées sur la cryptographie que vous trouvez sur Internet. (Clause de non-responsabilité: je ne suis pas Bruce Schneier.)
    2. Les sels déterministes ne sont pas un problème - la seule vraie exigence du sel est qu'il soit unique pour chaque utilisateur. Le véritable objectif du sel est d'empêcher qu'une force brute sur un mot de passe ne se transforme en force brute sur tous les mots de passe dans le cas d'une base de données compromise. Même si vous deviez stocker un sel aléatoire dans votre base de données juste à côté du mot de passe haché, vous atteindriez toujours cet objectif, à condition que chaque utilisateur soit différent.
    3. Comme je l'ai mentionné ci-dessus, PBKDF2 est bien parce que vous pouvez arbitrairement décider de la difficulté de calcul du hachage. Vous pouvez sélectionner un c de sorte qu'un hachage unique sur du matériel moderne ne prenne que quelques secondes, ce qui élimine efficacement le risque d'attaque par force brute au niveau de l'API. (Bien sûr, vos clients pourraient ne pas profiter d'un si long délai de connexion.)
    4. Un utilisateur peut choisir des mots de passe simples - ils ne font que se blesser. Si vous vouliez éliminer ce risque, vous demanderiez au serveur de générer le hachage la première fois, à condition que le mot de passe passe par un canal chiffré.
    5. Oui, et vous devrez également les saler de manière unique. En cas de compromission de la base de données, vous voulez vous assurer que l'attaquant n'obtient pas d'informations lui permettant de s'authentifier directement en tant qu'utilisateur de votre système. Une mise en garde ici est que vous ne voulez pas que votre hachage côté serveur soit intensif en calcul comme l'est votre hachage côté client. Si votre hachage côté serveur demande trop d'efforts, vous vous exposez à un vecteur d'attaque par déni de service épuisant du processeur - un attaquant envoie simplement des tentatives d'authentification par mot de passe vides sur Tor, des mots de passe que votre serveur doit essayer de hacher avant de savoir qu'ils sont frauduleux, vous laissant finalement avec un serveur débordé.
    Merci pour votre contribution sur tous ces points. Re: point 2, oui c'était / est ma compréhension .. que ce serait OK, tant que les sels sont toujours différents. Pour ce schéma, le sel sera différent pour différents e-mails, et également différent pour les e-mails _même_ dans les applications / bases de données _différentes_.
    Oui, comme vous et d'autres l'avez souligné, un nouveau hachage sur le serveur sera certainement nécessaire, même s'il sera fait à moindre coût comme vous le dites. Hmm .. Les requêtes Tor du même utilisateur ou de différentes machines derrière le même routeur NAT sembleront provenir de différentes adresses IP, n'est-ce pas?
    Oui, il existe des outils simples qui permettent d'acheminer plusieurs requêtes d'une seule machine via plusieurs nœuds de sortie Tor.
    ddyer
    2012-10-23 12:04:17 UTC
    view on stackexchange narkive permalink

    Si vous hachez le mot de passe côté client, quel que soit le résultat EST le mot de passe, vous ne gagnez donc pas de réelle sécurité. Tout piratage ou fuite d'informations qui aurait révélé le mot de passe en texte brut révélera à la place le mot de passe haché, qui est le vrai mot de passe.

    Cela ne doit pas être confondu avec les schémas d'authentification à connaissance nulle, où un échange de messages prouve que le client connaît le vrai mot de passe, sans le transmettre réellement.

    Si vous parlez du cas où la base de données du serveur est compromise, comme l'a souligné David Wachtfogel, alors oui, vous avez raison de dire que le hachage pourrait simplement être retransmis en tant que mot de passe. Il doit être haché à nouveau sur le serveur. Le gain n'est pas une sécurité renforcée, mais une tranquillité d'esprit pour l'utilisateur du serveur ne recevant pas de mot de passe littéral. Si, d'un autre côté, vous voulez dire des attaques de type "man-in-the-middle", le schéma de chiffrement sous-jacent protège contre la répétition de quoi que ce soit, qu'il s'agisse de mots de passe littéraux ou hachés.
    Désolé mais "révélera plutôt le mot de passe haché, qui est le vrai mot de passe" n'est pas vraiment vrai du point de vue de l'utilisateur.S'il y a une fuite, je parie que chaque utilisateur préférerait divulguer un mot de passe haché au lieu d'un mot de passe simple, surtout s'il utilise le même mot de passe pour différents services, ce que de nombreux utilisateurs font malheureusement, il est donc préférable que le mot de passe soit haché à la fois côté client et côté serveur.
    Stephen Touset
    2012-10-24 01:02:22 UTC
    view on stackexchange narkive permalink

    Il semble que vous essayez d'inventer votre propre protocole cryptographique. D'après la description de votre approche, il ne semble pas que vous ayez les connaissances nécessaires pour le faire de manière sécurisée. Je recommande vivement d'utiliser les protocoles existants au lieu de créer les vôtres.

    Premièrement, le modèle de menace que vous pensez contourner n'est pas clair. Vous citez ce qu'on appelle une "attaque de rétro-ingénierie" qui n'a pas de définition ou de signification réelle.

    Deuxièmement, votre compréhension du but d'un sel et des meilleures pratiques pour sa génération semble faire défaut. Les sels ne doivent pas être tenus secrets. Vous pouvez (et devriez) générer un sel unique à partir d'un CSPRNG pour chaque nouveau jeton d'authentification, et non à partir de quelque chose comme une adresse e-mail (qui pourrait changer). Les sels spécifiques aux applications fixes sont parfois appelés "piments", et je ne connais aucune littérature cryptographique qui soutienne ou encourage leur utilisation.

    Troisièmement, PBKDF2 est correct, mais sérieusement, utilisez simplement BCrypt. BCrypt a été conçu pour cela et est largement utilisé. De bonnes implémentations de BCrypt gèreront la génération de sel et l'étalonnage / détection automatique du facteur de travail pour vous. Vous devrez implémenter ces choses vous-même pour utiliser PBKDF2, et vous ferez presque inévitablement des erreurs.

    Quatrièmement, il existe une approche existante de ce que vous semblez essayer de faire. L'authentification sans connaissance peut être effectuée avec SRP. Le mot de passe de l'utilisateur n'est jamais transmis sur le fil, et un homme au milieu ne peut rien renifler d'utile pour s'authentifier. Cependant, il est apparemment difficile de l'implémenter correctement et il n'y a pas beaucoup de bibliothèques existantes pour le faire, ce qui devrait vous donner une indication de la difficulté du problème.

    En bref: n'inventez pas votre propre crypto. Utilisez des solutions et des protocoles largement mis en œuvre et qui ont résisté à l'épreuve du temps.

    Oui, je me méfie beaucoup de faire des choses en dehors des protocoles établis, mais si un hachage côté client du mot de passe (plutôt que de l'envoyer sous forme littérale, bien que toujours crypté et non cédé) est un non-non, j'aimerais avoir de l'aide pour comprendre mal. J'ai édité la question pour mettre davantage l'accent sur l'objectif: la tranquillité d'esprit pour l'utilisateur de ne pas avoir son mot de passe littéral reçu par le serveur.
    Dans le cas d'un e-mail modifié, l'utilisateur devra fournir son mot de passe à ce moment-là pour qu'il puisse être haché à nouveau, mais sinon, cela devrait être bien. Le sel sera différent pour différents e-mails et différent de celui utilisé dans d'autres applications en raison du sel supplémentaire fixe jeté (spécifique à cette application) pour chaque hachage. De plus, BCrypt est certainement une possibilité que je considérerai. Merci pour vos pensées.
    La toute première raison pour laquelle c'est un non-non est que vous * allez * vous tromper. Je ne veux pas dire aucune offense par cela, mais il y a tout simplement trop d'endroits où faire une erreur critique pour que vous ayez une espérance raisonnable de succès. Quelle que soit la sécurité qui pourrait être obtenue en ne transmettant pas le mot de passe sur le câble, elle sera effacée à la seconde où vous comparerez le résumé à la valeur stockée à l'aide de la base de données ou de la fonction de comparaison de chaînes intégrée à votre langue. Ou lorsque vous faites une erreur sur l'une des douzaines d'autres opérations.
    Une autre raison est que l'accès en lecture à la base de données suffit désormais à un attaquant pour se faire passer pour n'importe quel utilisateur. La sécurité est une question de défense en profondeur - superposer la sécurité de sorte qu'un attaquant exploitant une défaillance à un niveau de sécurité soit toujours bloqué par des couches plus profondes. La conversion d'une défaillance de sécurité importante en une défaillance absolument critique est exactement le contraire de cet objectif.
    Aucune offense prise, j'apprécie l'avertissement et votre temps pour considérer le prob. Je me méfie de tout schéma qui semble hors de l'ordinaire, d'où ma première préoccupation dans le PO. D'après ce que vous dites, devrais-je ne pas me sentir en sécurité en envoyant quoi que ce soit sur un flux crypté et protégé contre la relecture? c'est à dire. le protocole qui se trouve sous cette authentification client? Pour m'aider à comprendre, quels sont les pièges spécifiques à ce cas? Vous avez raison sur l'accès en lecture à la base de données fournissant effectivement une connexion gratuite. Un re-hachage (léger) sur le serveur atténuerait-il ce problème?
    Oui, mais vous jouez avec des failles de sécurité. SSL est parfaitement adapté pour envoyer des informations sensibles. PBKDF2 convient parfaitement pour masquer les mots de passe (mais BCrypt est probablement meilleur). Mais c'est l'implémentation de * tout le reste * qui sera faible. Vous pensez à un niveau trop bas au problème pour votre niveau de compétence. Vous ne devriez pas concevoir vous-même des protocoles d'authentification, mais plutôt choisir parmi des approches préexistantes qui ont été conçues par des professionnels et qui ont résisté à l'épreuve du temps.
    À titre d'exemple, comment comptez-vous valider les informations d'authentification reçues via le fil? `SELECT * FROM utilisateurs WHERE email =? AND password_digest =? `?. Chargez d'abord l'utilisateur par e-mail et faites `user.password_digest == params ['password_digest']`? Vous venez d'autoriser un attaquant à s'authentifier comme n'importe quel utilisateur. Si vous ne voyez pas immédiatement pourquoi, cela devrait être un signe d'avertissement fort que vous marchez aveuglément dans un champ de mines.
    Parlez-vous de SQL ou d'autres types d'injection de code?
    Non, mais ces approches sont toutes deux vulnérables aux attaques chronométrées. Après réflexion, je pense que vous regardez cela sous un mauvais angle. Vous ne devriez pas vous poser la question "en quoi le système que j'ai inventé n'est-il pas sûr?" Il devrait être * supposé * non sécurisé, et le but devrait être de démontrer le contraire.
    J'essaye d'adopter l'état d'esprit d'un attaquant mais j'ai peut-être été trop concentré sur des possibilités telles que DDOS tout en manquant d'autres trous plus évidents ... mais c'est aussi pourquoi je demande des commentaires d'experts ici. Je préfère de loin être abattu ici que sur un serveur en direct.
    Les attaques de synchronisation sont-elles réalisables via une connexion Internet, même sur un serveur avec une charge faible ou constante? Je ne suis pas sûr que même les requêtes avec une charge utile identique utilisant un égal classique ou lent feraient un bip sur le radar lorsque vous prenez en compte les chemins de code variables (seaux de table aléatoire et de hachage sécurisés) et la vigilance des threads, tous s'exécutant sur un colosse comme Java où il se passe beaucoup de choses dans les coulisses. C'est cependant une possibilité intéressante.
    [Ils sont] (http://crypto.stanford.edu/~dabo/papers/ssl-timing.pdf), selon les chercheurs de Stanford. La bonne solution consiste à utiliser un algorithme de comparaison à temps constant. Les verrouillages après des tentatives infructueuses aident également à atténuer le problème, mais il est préférable de simplement résoudre le problème racine - la politique sur les verrouillages pourrait changer à l'avenir. Le point n'était pas sur la seule attaque, cependant, mais que ce truc est * dur *, et il existe un nombre incalculable de façons de le gâcher. Dans la mesure du possible, utilisez des constructions de haut niveau (par exemple, "authentifier l'utilisateur") au lieu de celles de bas niveau ("AES" ou "PBKDF2").
    Oui, il est facile de s'y plonger, difficile de bien faire. Même avec vos idées, je suis honnêtement toujours enclin à procéder au hachage côté client pour ce projet particulier, car il s'agit plus d'un exercice d'apprentissage que de quelque chose de critique. Cette étude de Stanford était intéressante, du moins les parties non mathématiques que je pouvais comprendre. Cela me fait me demander si les attaquants doivent essayer d'obtenir un hébergement sur la même colocation que leur cible afin d'obtenir une position de premier choix sur le réseau pour le timing. Quoi qu'il en soit, merci encore pour tout votre temps et vos idées, grandement appréciés.
    Thomas Pornin
    2013-02-24 04:54:39 UTC
    view on stackexchange narkive permalink

    Le hachage sur le client peut être une bonne idée dans certaines circonstances et pour certaines raisons, mais je ne ferais pas de la "tranquillité d'esprit de l'utilisateur" l'une d'elles. Je suis tout à fait pour que les utilisateurs soient dans un état d'esprit harmonieux et en union avec l'Univers, mais je trouve douteuse l'idée de promouvoir un moyen d'inciter les utilisateurs à réutiliser le même mot de passe sur plusieurs sites.

    Un bon cas pour le hachage côté client est le fonctionnement de certains "coffres-forts de mots de passe": ils calculent un mot de passe spécifique au site en hachant le "mot de passe principal" de l'utilisateur avec le nom du site. Cela donne la plupart de la possibilité d'utiliser toujours le même mot de passe partout, sans donner réellement votre mot de passe principal à des dizaines de sites distincts. Mais cela ne fonctionne que tant que l'algorithme de dérivation du mot de passe est générique et ne change pas; cela semble être beaucoup mieux traité par une extension de navigateur Web que par une applet provenant des sites eux-mêmes (tous les sites devraient coopérer pour utiliser des applets utilisant le même algorithme de dérivation de mot de passe, avec des données spécifiques au site).

    Un autre bon cas pour le hachage de mot de passe côté client est l'utilisation d'un hachage lent (afin de rendre le piratage de mot de passe plus difficile pour un attaquant qui pourrait récupérer une copie de la base de données de hachage mots de passe); il est tentant d'essayer de décharger le coût sur le client, car, lorsque le client veut se connecter, il est généralement inactif et activement intéressé à se connecter. Cependant, le hachage lent est une course aux armements entre l'attaquant et le défenseur. L'utilisation de Java induira un ralentissement (d'un facteur typique de 3), et certains systèmes clients peuvent être assez faibles (par exemple, des smartphones bon marché ou des ordinateurs vieux de dix ans). C'est comme prendre une épée au lieu d'un fusil d'assaut avant d'entrer dans une bataille où l'adversaire apportera un char.

    Mais si ce que vous voulez, en tant qu'utilisateur, c'est protéger votre mot de passe contre les procédures de stockage bâclées par un site, alors la bonne façon de le faire est de choisir un mot de passe différent pour chaque site . (Personnellement, je garde un fichier de mots de passe, et tous mes mots de passe sont générés aléatoirement.)

    Merci d'avoir pris le temps de partager vos idées d'expert (j'ai lu beaucoup de vos autres articles) sur cette question, et désolé d'avoir mis si longtemps à répondre - je ne saute pas ici très souvent. Après avoir pesé les considérations, j'ai fini par implémenter le hachage côté client, autant céder à la tentation de décharger le coût d'un hachage lent sur le client (comme vous le dites) que d'avoir le serveur éviter de gérer les mots de passe bruts. Comme je me suis demandé dans l'OP et aussi comme quelqu'un l'a souligné, un rehash côté serveur est de toute façon nécessaire, bien que plus léger que PBKDF2.
    goodguys_activate
    2012-10-23 18:54:30 UTC
    view on stackexchange narkive permalink

    Un employé de Google travaille sur quelque chose de similaire appelé TLS-OBC. Ce projet RFC permet au client de hacher le mot de passe et de le lier à une session TLS.

    Plus précisément, vous pourriez être intéressé par ce site Web http://www.browserauth.net/origin-bound-certificates

    et ce lien sur Strong User Authentification http://www.browserauth.net/strong-user-authentication

    ::Update

    OBC et peut-être l'autre est maintenant intégré dans la norme d'authentification FIDO.

    Merci pour les liens, ça a l'air intéressant. Pouvez-vous fournir un lien vers des informations sur l'aspect de hachage de mot de passe côté client?
    Luc
    2019-01-09 16:19:17 UTC
    view on stackexchange narkive permalink

    Le hachage du mot de passe permet d’empêcher quiconque sauf l’utilisateur d’apprendre le mot de passe. Les gens réutilisent les mots de passe et ils ne sont généralement pas très forts s'ils sont mémorisés. C'est pourquoi nous nous préoccupons des hachages lents (Bcrypt, Scrypt, Argon2, etc.) au lieu d'un hachage rapide: il protège mieux le mot de passe de l'utilisateur, même s'il n'a aucun avantage pour l'application. Un avantage secondaire du hachage par le serveur d'un mot de passe entrant avant de le stocker dans la base de données est que quelqu'un qui compromet la base de données ne peut se connecter avec aucune des valeurs trouvées (il doit d'abord les casser).

    Nous voulons conserver les deux avantages. Pour cela, nous devons hacher sur le client (lent) et le serveur (rapide).

    Pourquoi sur le serveur?
    De sorte qu'un attaquant qui a obtenu la base de données ne peut pas utiliser les données obtenues pour se connecter. Si votre client effectue déjà un hachage lent, il peut s'agir d'un seul cycle d'un algorithme de hachage sécurisé (comme SHA-3 ou BLAKE2).

    Pourquoi sur le client?

    1. Transparence
      Chaque fois qu'une entreprise est piratée, nous devons espérer qu'elle nous dira comment les mots de passe ont été haché, voire pas du tout. Il y a encore des endroits qui les stockent en clair, ou utilisent un algorithme rapide, ou ne les salent pas, etc. En faisant du hachage côté client, les personnes intéressées peuvent voir comment cela est fait et éviter les questions comme celles-ci. Ma mère ne le vérifiera pas, mais ma mère ne vérifie pas non plus le TLS d'un site Web à la recherche de saignements de cœur: les "hackers éthiques" ou les pirates blancs le font.

    2. Déchargez le serveur
      Le risque de faire des hachages très lents sur le serveur est qu'un attaquant puisse l'utiliser pour une attaque par déni de service: si le serveur a besoin de 2 secondes pour traiter chaque tentative de connexion, les attaquants ont un énorme avantage à tenter de le supprimer. En faisant le hachage lent sur le client (dont le processeur est de toute façon inutilisé 99% du temps, et ce n'est pas comme si la plupart des gens se connectaient à quelque chose plus de quelques fois par jour), vous déchargez le serveur, vous permettant de choisir des hachages plus lents sans risquer qu'un attaquant arrête votre serveur.

    3. Réduire l'impact d'une transmission compromise
      Si le canal de transmission sécurisé échoue pour une raison quelconque, par exemple un bogue dans TLS (juin 2020: "Oups, pour les 10 dernières versions, la plupart des connexions TLS 1.0-1.2 pouvaient être décryptées passivement"), l'impact est réduit car un attaquant ne pourrait observer que les hachages au lieu du mot de passe d'origine . Cela s'applique également lorsque quelqu'un est capable de déchiffrer un flux chiffré des années plus tard, par exemple parce que RC4 est maintenant connu pour être cassé il y a plus de quelques années.
      Notez que dans le bogue de juin 2020, l'authentification ne semble pas être affecté, les attaquants n'auraient donc pas pu modifier les fichiers JavaScript pour supprimer le hachage. Maintenant, je me demande quels mots de passe j'ai utilisés depuis des mois sur https et si l'une de ces connexions a pu être interceptée passivement.

    4. Améliorer la norme
      pour que nous puissions voir la mise en œuvre de tout le monde, il y aura un débat sur qui a obtenu le plus long et qui a obtenu le meilleur. Cette discussion pousse définitivement les mauvais à faire mieux, et elle aboutit probablement aussi à une normalisation. Ce serait vraiment chouette si vous pouviez simplement ajouter un paramètre à l'élément d'entrée de mot de passe, comme <input type = password hash = v1> , ce qui ferait tout le hachage pour vous (il salerait avec le nom de domaine et le champ du nom d'utilisateur, mais tous ces détails de cette proposition sortent du cadre de cette réponse).

    5. Détection de compromission
      Un argument courant est que "si le serveur est compromis, les attaquants pourraient supprimer le code JavaScript responsable du hachage du mot de passe, permettant aux attaquants d'obtenir de toute façon le texte en clair". Cet argument n'est valable que pour les sites Web, mais les gens ne le mentionnent généralement pas, ce qui fait que personne ne hache non plus côté client dans les applications. Ce qu'ils oublient également, c'est que si le hachage côté client est courant, les chercheurs en sécurité peuvent commencer à l'utiliser: il y aura des personnes qui analyseront des sites Web importants pour voir si le hachage est toujours là (ce serait tout à fait l'indicateur de compromis si PayPal supprime hachage côté client (dans le cas hypothétique où ils feraient un hachage côté client en premier lieu)), et il pourrait y avoir des extensions de navigateur (ou des fonctionnalités intégrées) qui vous avertissent s'il est supprimé, tout comme nous avertissons pour la connexion formulaires sur les pages http.

    6. Pas d'espionnage secret
      Même s'ils hachent la base de données, les employés peuvent intercepter le mot de passe avant qu'il ne soit haché et stocké (en se connectant à un TLS point de terminaison ou en installant du code supplémentaire). Il y a suffisamment d'histoires d'employés aigres, voire d'adolescents qui construisent une application et veulent savoir quels sont les mots de passe de leurs utilisateurs.

    7. Pas d'e-mails en clair
      Si le serveur ne le fait pas avoir votre mot de passe, ils ne peuvent pas vous envoyer d'email du type "Merci de vous être inscrit, votre nom d'utilisateur et votre mot de passe sont xxx". Les e-mails sont généralement considérés comme non sécurisés, mais il existe encore des sites Web qui le font.

    8. Aucune exposition accidentelle
      Il y a eu un incident assez récent où des mots de passe ont été accidentellement écrits dans des fichiers journaux. Je ne mentionnerai pas le nom de l'entreprise car je ne pense pas que ce soit pertinent, mais c'était une grande entreprise de technologie avec une équipe de sécurité dédiée et tout. Des accidents comme ceux-ci se produisent simplement et cela a eu des retombées médiatiques assez importantes. Il y a en outre une exposition dans de nombreux réseaux où un système séparé effectue la terminaison TLS puis envoie la demande en clair à d'autres systèmes, permettant à n'importe quel boîtier réseau de voir les mots de passe (Google avait l'habitude de le faire jusqu'à ce qu'ils aient vent de la NSA ayant des interceptions dans leur interne. réseau). Les interceptions de mot de passe "en texte clair" seraient moins problématiques si nous faisions le hachage avant que le mot de passe n'atteigne le réseau.

    9. Pourquoi pas?
      Je ne vois aucune raison pourquoi vous ne devriez pas le faire, en supposant que vous fassiez en plus un hachage rapide sur le serveur (pour obtenir cet avantage secondaire mentionné dans le premier paragraphe). Même si vous pensez qu'une seule des raisons est convaincante, alors ce serait toujours une amélioration.


    Je pense que la seule raison pour laquelle le hachage côté client n'est pas commun, c'est parce que c'est rare. Chaque fois qu'il est proposé, les gens se demandent pourquoi c'est si rare s'il n'y a que des avantages. La décision de ne faire que le hachage côté serveur semble souvent rationalisée. Voici quelques-uns des arguments que j'ai entendus auparavant:

    • "Un attaquant supprimerait simplement le code responsable du hachage!" Cela s'applique uniquement aux applications Web. Les applications normales (parmi lesquelles les applications mobiles) ne présentent pas ce problème.
    • "Mais mon cas s'applique à une application Web!" Si le hachage côté client était courant pour les applications Web, nous verrions probablement une normalisation (pensez à <input type = password hashversion = 1> ) similaire à la façon dont les langages et les frameworks ont des fonctions de hachage standard que les développeurs peuvent utiliser. Si un champ est envoyé en texte clair, le navigateur peut l'indiquer. Nous pouvons facilement normaliser cela, mais seulement si les développeurs expriment réellement l'intention de le faire et que nous choisissons de nous en soucier.
    • "Mais quel que soit le résultat [du hachage côté client], c'est le mot de passe!" Si votre base de données de connexion est compromise, il est peu probable qu'un attaquant ait encore besoin de se connecter à votre application pour en récupérer toutes les données. La défense en profondeur de la plupart des systèmes n'est vraiment pas si bonne, mais même si c'est le cas, l'argument est nul car le conseil est de faire un hachage rapide supplémentaire sur le serveur.
    • "Vous devriez simplement utilisez un gestionnaire de mots de passe au lieu de vous fier à la sécurité des hachages! " Je suis d'accord, ce serait idéal. Authentification à deux facteurs partout, utilisée par tout le monde, avec des gestionnaires de mots de passe et des cartes à puce ... ouais, quand ce jour viendra, nous n'avons plus du tout besoin de hachage de mot de passe. Vous devriez toujours faire un hachage rapide sur le serveur pour l'avantage secondaire susmentionné, mais nous pouvons arrêter de faire des algorithmes de hachage lents et du hachage côté client car personne ne réutiliserait les mots de passe de toute façon.
    • "Vous ne devriez pas mettre l'utilisateur en charge de la sécurité! " Ils sont déjà en charge de la sécurité: vous pouvez toujours choisir d'avoir 123456 comme mot de passe (ou s'il y a des exigences idiotes, vous pouvez toujours faire "Bailey2009!"). Vous pouvez également publier les clés de votre connexion TLS et annuler sa sécurité. L'utilisateur pourra toujours gâcher la sécurité que vous implémentez s'il le souhaite.
    • "Mais comment allez-vous saler le hachage?" Le champ du nom d'utilisateur, peut-être combiné avec un nom de domaine ou d'entreprise pour le rendre unique au monde. Un sel n'est pas secret, seulement unique, tout comme le champ de votre nom d'utilisateur.
    +1, quelques points cependant: 1) les smartphones limitent la quantité de puissance de traitement que vous pouvez affecter au hachage côté client si vous souhaitez que votre application Web / mobile soit utilisable.2) Saler avec le nom d'utilisateur est bien mieux que rien, mais ce n'est pas idéal.Les noms d'utilisateur ne sont pas uniques au monde et sont assez prévisibles.Probablement pas un gros problème, mais ce n'est pas si génial.
    De plus, l '[api web crypto] (https://www.w3.org/TR/WebCryptoAPI/#pbkdf2) prend en charge PBKDF2, permettant l'utilisation d'une implémentation native (et pas terriblement lente), mais il n'y a pas (encore) de supportpour Argon2 ou Bcrypt.D'autre part, cette [démo bcrypt js] (https://fpirsch.github.io/twin-bcrypt/) utilisant asm.js fonctionne sur mon téléphone en quelques secondes seulement, et bien que ce soit quelques ordres de grandeur de plusqu'une implémentation native sur mon bureau, cela peut toujours être acceptable.Peut-être que les améliorations matérielles et js en ont fait plus un problème.
    Récemment, il y a eu un cas où une entreprise a interdit un compte parce que l'utilisateur utilisait un mot de passe que l'entreprise n'aimait pas, ce qui m'a conduit à ce problème de sites Web envoyant mon mot de passe que je saisis en clair.Beaucoup de gens affirment que le hachage client n'est pas nécessaire, et la plupart du temps, l'argument est simplement "ne soyez pas stupide! Personne ne le fait!"ou leurs arguments imposent des contraintes ridicules telles que les serveurs cesseront soudainement d'utiliser le stockage de mot de passe approprié parce qu'ils l'ont «déchargé» vers le client?Lol
    @AndrolGenhald c'est un smartphone si vous pouvez jouer à League of Legends, vous pouvez hacher une chaîne.Je suppose que les appareils en 2019 étaient décents.On dirait que l'argument est "ce n'est pas tellement mieux, autant ne pas déranger"?


    Ce Q&R a été automatiquement traduit de la langue anglaise.Le contenu original est disponible sur stackexchange, que nous remercions pour la licence cc by-sa 3.0 sous laquelle il est distribué.
    Loading...