Dois-je hacher le mot de passe avant de l'envoyer côté serveur?

J'ai remarqué que la plupart des sites envoient les mots de passe en texte brut via HTTPS au serveur. Y a-t-il un avantage si, au lieu de cela, j'ai envoyé le hachage du mot de passe au serveur? Serait-il plus sûr?

77
demandé sur Jader Dias 2010-08-02 23:52:00

11 réponses

C'est une vieille question, mais j'ai ressenti le besoin de donner mon avis sur cette importante question. Il y a tellement de désinformation ici

L'OP n'a jamais mentionné l'envoi du mot de passe en clair sur HTTP uniquement HTTPS, mais beaucoup semblent répondre à la question de l'envoi d'un mot de passe sur HTTP pour une raison quelconque. Cela dit:

Je crois que les mots de passe ne devraient jamais être conservés (et encore moins transmis) en texte brut. Cela signifie pas conservé sur le disque, ou même en mémoire.

Personnes répondre ici semble penser que HTTPS est une balle en argent, ce qui n'est pas le cas. Il aide certainement grandement cependant, et devrait être utilisé dans toute session authentifiée.

Il n'y a vraiment pas besoin de savoir ce qu'est un mot de passe original. Tout ce qui est nécessaire est un moyen fiable de générer (et de générer de manière fiable) une "clé" d'authentification basée sur le texte original choisi par l'utilisateur. Dans un monde idéal, ce texte devrait immédiatement générer une " clé " en la hachant en utilisant du sel irréversible. Ce sel doit être unique aux informations d'identification de l'utilisateur générées. Cette " clé " sera ce que vos systèmes utilisent comme mot de passe. De cette façon, si vos systèmes sont compromis à l'avenir, ces informations d'identification ne seront jamais utiles contre votre propre organisation, et nulle part ailleurs où l'Utilisateur a été paresseux et a utilisé le même mot de passe.

Donc nous avons une clé. Maintenant, nous devons nettoyer toute trace du mot de passe sur l'appareil des clients.

Ensuite, nous devons obtenir cette clé à vos systèmes. Vous ne doit jamais transmettre une clé ou un mot de passe "en clair". Pas même sur HTTPS. HTTPS n'est pas impénétrable. En fait, de nombreuses organisations peuvent devenir un MITM de confiance-pas du point de vue d'une attaque, mais pour effectuer des inspections sur le trafic pour mettre en œuvre leurs propres politiques de sécurité. Cela affaiblit HTTPS, et ce n'est pas la seule façon dont cela se produit (comme les redirections vers des attaques HTTP MITM par exemple). Ne supposez jamais qu'il est sécurisé.

Pour contourner cela, nous hachons la clé avec un nonce une fois éteint. Ce nonce est unique pour chaque soumission d'une clé à vos systèmes-même pour les mêmes informations d'identification au cours de la même session si vous devez l'envoyer plusieurs fois. Vous pouvez inverser ce nonce une fois qu'il arrive dans vos propres systèmes pour récupérer la clé d'authentification et authentifier la demande.

À ce stade, je le hacherais irréversiblement une dernière fois avant qu'il ne soit stocké en permanence dans vos propres systèmes. De cette façon, vous pouvez partager le sel des informations d'identification avec les organisations partenaires aux fins de SSO et autres, tout en étant en mesure de prouver que votre propre organisation ne peut pas usurper l'identité de l'utilisateur. La meilleure partie de cette approche est que vous ne partagez jamais rien généré par l'utilisateur sans son autorisation.

Faites plus de recherches, car il y a plus que ce que j'ai divulgué, mais si vous voulez fournir une véritable sécurité à vos utilisateurs, je pense que cette méthode est actuellement la réponse la plus complète ici.

TL; DR:

Utilisez HTTPS. Hachez les mots de passe en toute sécurité, de manière irréversible, avec un sel unique par mot de passe. Faites ceci sur le client - ne transmettez pas leur mot de passe réel. Transmettre le mot de passe d'origine des utilisateurs à vos serveurs n'est jamais "OK" ou "bien". Nettoyer toute trace du mot de passe d'origine. Utilisez un nonce indépendamment de HTTP / HTTPS. Il est beaucoup plus sûr à plusieurs niveaux. (Réponse à L'OP).

103
répondu user3299591 2014-02-12 01:25:03

Comme C'est sur HTTPS, il est certainement très bien d'envoyer le mot de passe sans hachage (sur HTTPS, ce n'est pas du texte en clair). De plus, si votre application dépend de HTTPS pour garder son contenu sécurisé, il est inutile de hacher le mot de passe avant de l'envoyer sur HTTPS (c'est-à-dire si un attaquant peut déchiffrer les données sur le fil, vous êtes foutu de toute façon)

21
répondu Chris Arnold 2010-08-02 19:56:55

Non, en fait ce serait une vulnérabilité. Si l'attaquant est capable d'obtenir le hachage de la base de données, il pourrait l'utiliser pour s'authentifier sans avoir besoin de le casser. En aucun cas un utilisateur ou un attaquant ne devrait être en mesure d'obtenir un mot de passe de hachage.

Le but du hachage des mots de passe est d'ajouter une couche supplémentaire de sécurité. Si un attaquant est capable d'obtenir le hachage et le sel de la base de données en utilisant L'Injection SQL ou une sauvegarde non sécurisée il doit trouver la plaine texte par brute le forçant. John the Ripper {[6] } est couramment utilisé pour casser les hachages de mot de passe salés.

Ne pas utiliser https est une violation du Top 10 OWASP: A9-protection insuffisante de la couche de Transport

Modifier: Si dans votre implémentation vous calculez un sha256(client_salt+plain_text_password) puis calculez un autre hachage Côté Serveur sha256(server_salt+client_hash) alors ce n'est pas une vulnérabilité sérieuse. Cependant, il est toujours susceptible d'écouter et de rejouer la demande. Donc c'est encore un violation claire de WASP A9. Cependant, cela utilise toujours un résumé de message comme couche de sécurité.

La chose la plus proche que j'ai vue d'un remplacement côté client pour https est un diffie-hellman dans l'échange de clés en javascript. Cependant, cela empêche les attaques MITM actives et est donc jusqu'à la technicité une violation de OWASP A9. Les auteurs du code conviennent que ce n'est pas un remplacement complet pour HTTPS, mais c'est mieux que rien et mieux qu'un côté client le hachage du système.

15
répondu rook 2014-06-11 08:36:39

L'envoi d'un hachage sur le fil va complètement à l'encontre du but du hachage, car un attaquant peut simplement envoyer le hachage et oublier le mot de passe. En un mot, un système qui athenticates en utilisant un hachage en texte clair est grand ouvert et peut être compromis avec rien de plus que renifler le réseau.

7
répondu Paul Keister 2010-08-02 20:07:56

Le mot de passe en texte brut n'affiche jamais (même pas lors de L'utilisation de HTTPS) quitter le client. Il doit être haché de manière irréversible avant de quitter le client car il n'est pas nécessaire que le serveur connaisse le mot de passe réel.

Le hachage puis la transmission résout les problèmes de sécurité pour les utilisateurs paresseux qui utilisent le même mot de passe à plusieurs endroits (je sais que je le fais). Cependant, cela ne protège pas votre application en tant que pirate informatique qui a eu accès à la base de données (ou de toute autre manière a pu mettre la main sur le hachage) comme le pirate pourrait simplement transmettre le hachage et le faire accepter par le serveur.

Pour résoudre ce problème, vous pouvez bien sûr de hachage hachage le serveur reçoit et l'appeler un jour.

Mon approche du problème dans une application web basée sur les sockets que je crée est que lors de la connexion au client, le serveur génère un sel (chaîne aléatoire à ajouter avant le hachage) et le stocke sur la variable sockets, puis il transmet ce hachage au client. Le client prend les utilisateurs mot de passe, le hache, ajoute le sel du serveur et hache le tout, avant de le transmettre au serveur. Ensuite, il est envoyé au serveur qui compare ce hachage au hachage (hachage dans la base de données + sel). Pour autant que je sache, c'est une bonne approche, mais pour être juste, je n'ai pas beaucoup lu sur le sujet et si je me trompe sur quoi que ce soit, j'aimerais être corrigé:)

3
répondu Victor Zimmer 2015-10-22 15:11:31

Utilisez HTTP Digest - il sécurise le mot de passe même sur http (mais le meilleur usage serait HTTP digest sur https)

Wikipédia:

L'authentification D'accès HTTP digest est l'une des méthodes convenues qu'un serveur web peut utiliser pour négocier des informations d'identification avec un utilisateur web (en utilisant le protocole HTTP). L'authentification Digest est destinée à remplacer l'utilisation non cryptée de l'authentification D'accès de base, permettant d'établir l'identité de l'utilisateur en toute sécurité sans avoir à envoyer un mot de passe en texte clair sur le réseau. L'authentification Digest est essentiellement une application de hachage cryptographique MD5 avec l'utilisation de valeurs nonce pour empêcher la cryptanalyse.

Lien: http://en.wikipedia.org/wiki/Digest_access_authentication

Si vous voulez voir une utilisation "réelle", vous pouvez regarder phpMyID-un fournisseur PHP openid qui utilise l'authentification HTTP digest http://siege.org/phpmyid.php

.. ou vous pouvez commencer à partir des échantillons PHP auth à http://php.net/manual/en/features.http-auth.php

HTTP digest rfc: http://www.faqs.org/rfcs/rfc2617

De mes tests tous les navigateurs modernes supportent...

2
répondu vlad b. 2010-08-02 20:05:29

Si vous cherchez à remplacer un mot de passe en texte clair sur HTTPS par un mot de passe haché sur HTTP, vous demandez des problèmes. HTTPS génère une clé de transaction partagée aléatoire lors de l'ouverture d'un canal de communication. C'est difficile à craquer, car vous êtes à peu près limité à forcer la clé partagée utilisée pour une transaction (relativement) à court terme. Alors que votre hachage peut être simplement reniflé, pris hors ligne et regardé dans une table arc-en-ciel ou simplement forcé sur une longue quantité de temps.

Cependant, une obfuscation de mot de passe côté client de base (Pas de hachage) envoyée via HTTPS a une certaine valeur. Si Je ne me trompe pas, cette technique est effectivement utilisée par certaines banques. Le but de cette technique n'est pas de protéger le mot de passe de renifler sur le fil. Au contraire, c'est pour empêcher le mot de passe d'être utilisable pour des outils d'Espionnage stupides et des plug-ins de navigateur qui récupèrent toutes les requêtes HTTPS GET/POST qu'ils voient. J'ai vu un fichier journal capturé à partir d'un site Web malveillant qui était de 400 Mo de transactions GET / POST aléatoires capturées à partir de sessions utilisateur. Vous pouvez imaginer que les sites Web qui utilisaient juste HTTPS apparaîtraient avec des mots de passe en texte clair dans le journal, mais les sites Web avec une obfuscation très basique (ROT13) apparaîtraient également avec des mots de passe qui ne sont pas immédiatement utiles.

2
répondu Simon at LabSlice-com 2010-09-13 02:37:37

Avertissement: Je ne suis pas un expert en sécurité - et je poste avec le espoir que d'autres critiqueront ma position comme trop prudent ou améliorable et j'en apprendrai. Cela dit, je veux juste souligner que le hachage quand il quitte votre client ne signifie pas que vous n'avez pas à hacher sur le backend avant de le mettre dans la base de données.

Faire les deux

Faites les deux parce que:

  1. Le hachage sur le trajet aide à couvrir vulnérabilités de transport, si la connexion SSL est compromise, ils ne peuvent toujours pas voir le mot de passe brut. Cela n'aura pas d'importance en termes de pouvoir usurper l'identité d'utilisateurs autorisés, mais cela protégera vos utilisateurs contre la lecture de leurs mots de passe en association avec leur e-mail. La plupart des gens ne suivent pas les meilleures pratiques et utilisent le même mot de passe pour beaucoup de leurs comptes, donc cela peut être une vulnérabilité sérieuse pour vos visiteurs.

  2. Si quelqu'un, en quelque sorte était capable de lire les mots de passe de la base de données (cela arrive, pensez à L'injection SQL), ils ne seront toujours pas en mesure d'exécuter des actions privilégiées se faisant passer pour des utilisateurs via mon API. C'est à cause de l'asymétrie de hachage; même s'ils connaissent le hachage stocké dans votre base de données, ils ne connaîtront pas la clé d'origine utilisée pour la créer et c'est ce que votre middleware auth utilise pour s'authentifier. C'est aussi pourquoi vous devriez toujours saler votre stockage de hachage.

Certes, ils pourraient faire beaucoup d'autres dégâts s'ils avaient la liberté de lire ce qu'ils voulez à partir de votre base de données.

Je veux juste souligner ici que si vous décidez de hacher la clé avant le départ de vos clients, ce n'est pas suffisant-le hachage backend est, imo, beaucoup plus important et c'est pourquoi: si quelqu'un intercepte le trafic de votre client, alors ils verront le contenu du champ password. Qu'il s'agisse d'un hachage ou d'un texte brut, cela n'a pas d'importance-ils peuvent le copier textuellement pour usurper l'identité d'un client autorisé. (Sauf si vous suivez les étapes qui @ user3299591 décrit, et je vous recommande de le faire). Le hachage de la colonne DB, d'autre part, est une nécessité et pas du tout difficile à mettre en œuvre.

2
répondu pixelpax 2017-07-15 06:00:44

Si vous êtes connecté à un serveur https le flux de données entre le serveur et le navigateur doit être chiffré. Les données sont uniquement en texte brut avant d'être envoyées et après avoir été reçues. article de Wikipédia

1
répondu jac 2010-08-02 20:00:48

Il serait en fait moins sûr de hacher le mot de passe et de l'envoyer sur un canal non crypté. Vous exposerez votre algorithme de hachage sur le client. Les pirates pourraient simplement renifler le hachage du mot de passe, puis l'utiliser pour pirater plus tard.

En utilisant HTTPS, vous empêchez un pirate d'obtenir le mot de passe à partir d'une seule source, Puisque HTTPS utilise deux canaux, tous deux cryptés.

0
répondu Carter Medlin 2010-08-02 19:57:36

SSL/TLS ne remplace-t-il pas le nonce? Je ne vois pas de valeur ajoutée à cela puisque SSL / TLS protège également contre les attaques de relecture.

Réf. https://en.wikipedia.org/wiki/Cryptographic_nonce

0
répondu Tom Kip 2017-01-05 00:16:59