Question:
Est-il sûr d'envoyer des noms d'utilisateur / mots de passe clairs sur une connexion https pour authentifier les utilisateurs?
Emiliano
2014-08-04 18:56:32 UTC
view on stackexchange narkive permalink

Je mets en place un serveur HTTP domestique qui peut envoyer et recevoir des données JSON vers / depuis différents clients (applications Android et iPhone).

Je voudrais autoriser l'accès uniquement à certains utilisateurs et J'envisage d'utiliser un mécanisme simple de nom d'utilisateur / mot de passe, car la configuration des certificats clients semble un peu exagérée pour ce petit projet.

Bien sûr, je ne peux pas envoyer de mots de passe clairs du client au serveur sur HTTP simple, sinon toute personne avec WireShark / tcpdump installé pourrait le lire. Donc, je pense au mécanisme suivant:

  1. Le serveur HTTP peut être configuré comme serveur HTTPS
  2. Le serveur a également une base de données de nom d'utilisateur / mot de passe (les mots de passe peuvent être sauvé avec bcrypt)
  3. Le client ouvre la connexion HTTPS, il authentifie le serveur (donc un certificat de serveur est nécessaire) et après avoir échangé la clé principale, la connexion doit être chiffrée.
  4. Le client envoie le nom d'utilisateur / mot de passe en clair au serveur
  5. Le serveur exécute bcrypt sur le mot de passe et le compare avec celui stocké dans la base de données

Y a-t-il un problème avec ce genre de configuration? Le mot de passe doit être sûr car il est envoyé sur une connexion cryptée.

Juste pour ajouter aux réponses que vous avez déjà reçues, dans ce type de configuration, je recommanderais de regarder l'épinglage de certificat qui aide à atténuer les attaques MITM ...
Envisagez peut-être de hacher le mot de passe au lieu de (ou en plus) de le chiffrer.
Même si cela peut être sûr si vous utilisez https.Un problème que j'ai lu dans d'autres questions est que le nom d'utilisateur et le mot de passe seront écrits dans les journaux du serveur s'ils sont directement passés dans les URL.Cela peut être dangereux si la sécurité des journaux est compromise.
Huit réponses:
AJ Henderson
2014-08-04 21:23:04 UTC
view on stackexchange narkive permalink

Oui, c'est la pratique courante. Faire autre chose que cela offre un avantage supplémentaire minime, le cas échéant (et dans certains cas peut nuire à la sécurité). Tant que vous vérifiez une connexion SSL valide au bon serveur, le mot de passe est protégé sur le câble et ne peut être lu que par le serveur. Vous ne gagnez rien à déguiser le mot de passe avant de l'envoyer car le serveur ne peut pas faire confiance au client.

La seule façon dont les informations pourraient être perdues de toute façon est si la connexion SSL était compromise et si la connexion SSL était d'une manière ou d'une autre compromise, le jeton «déguisé» serait toujours tout ce qui est nécessaire pour accéder au compte il ne sert donc à rien de protéger davantage le mot de passe. (Cela fournit sans doute une légère protection s'ils ont utilisé le même mot de passe sur plusieurs comptes, mais s'ils le font, ils ne sont pas particulièrement soucieux de la sécurité au départ.)

Comme l'a souligné MyFreeWeb, il existe également des systèmes élaborés qui peuvent utiliser une réponse de défi pour s'assurer que le mot de passe est détenu par le client, mais ils sont vraiment élaborés et pas du tout largement utilisés. Ils n'offrent toujours pas non plus beaucoup d'avantages supplémentaires car ils ne protègent que le mot de passe d'être compromis sur un serveur activement piraté.

@AJHenderson +1, demander au client d'envoyer le hachage serait certainement mauvais, car le but du protocole d'authentification est de s'assurer que le visiteur connaît le bon * mot de passe *, et non le bon mot de passe * hash *. Si une partie malveillante pouvait obtenir le hachage (base de données de mots de passe volés, homme au milieu, peu importe) et que le système comptait sur le visiteur envoyant le hachage au lieu du mot de passe, toute notion de sécurité réelle serait exclue.
Il est parfois avantageux de hacher au niveau du client, puis de hacher un peu plus sur le serveur. Cela peut aider à garantir que le mot de passe est masqué dans tous les journaux en texte clair au niveau du client, du serveur et du réseau.
@Craig Laisser le client calculer le hachage salé coûteux est parfaitement bien, tant que vous appliquez un hachage non salé bon marché sur le serveur avant de le stocker (ou un autre type de fonction à sens unique, comme l'exponentiation modulaire).
@AndyBoura - si vous concevez le système de telle sorte que vous puissiez prendre en charge le hachage côté client, vous contrôlez le comportement du réseau et du serveur pour les parties qui auraient accès au texte clair. Certes, vous n'êtes pas blessé par le hachage sur le client (autre que le temps perdu), à condition que cela n'affecte pas de manière significative la quantité de hachage que vous faites sur le serveur.
@CodesInChaos - Je dirais seulement que c'est un peu moins mauvais. Même en utilisant un hachage complexe pour faire une entrée «plus longue», ce n'est qu'une extension de clé et un attaquant va être capable de produire très facilement beaucoup de hachages bon marché. En pratique, peu importe si la sortie de hachage côté client est longue et qu'aucune vulnérabilité dans l'un ou l'autre des hachages ne limite l'expansion à partir de valeurs simples. Il est également important de noter que dans un tel cas, vous devrez saler à la fois les hachages côté client et côté serveur. Je suis encore un peu dubitatif quant au coût par rapport aux avantages.
@AJHenderson Le hachage côté client présente plusieurs avantages: 1) Limite de temps plus longue car le client n'a pas besoin de gérer plusieurs connexions en même temps. 2) Evite DoS car le serveur n'a pas besoin de calculer un hachage coûteux. 3) Le serveur n'apprend pas le mot de passe. | Le principal inconvénient est que les clients ont souvent un processeur plus lent que le serveur. | Je ne vois pas pourquoi le hachage côté serveur devrait utiliser un sel alors que le hachage côté client en utilise déjà un.
@CodesInChaos - Parce que rien du côté client n'est fiable. Un attaquant peut ignorer l'intégralité du processus lent en contournant entièrement le client. Vous devez vous assurer que vous ne pouvez pas créer une table arc-en-ciel de valeurs de hachage rapides et bon marché. Ce n'est pas faisable si vous salez chacun d'eux et à condition que le hachage intermédiaire soit suffisamment long. Sinon, vous créez simplement une table arc-en-ciel de valeurs de hachage qui peuvent être générées à une vitesse très, TRÈS rapide si elles sont bon marché.
@AJHenderson De toute évidence, la valeur intermédiaire doit être suffisamment grande pour éviter l'énumération, au moins 128 bits de préférence 160-256 pour tenir compte des attaques multi-cibles. Puisque l'utilisation d'un hachage approprié comme SHA-256 est si facile, je ne vois aucune raison d'ajouter des complications inutiles comme un sel.
@CodesInChaos - oui, si vous utilisez un hachage intermédiaire suffisamment grand et que vous êtes sûr qu'il se comporte bien (distribution vraiment aléatoire), cela devrait être correct tant que le hachage initial est salé et prend suffisamment de temps pour forcer l'utilisation d'une énumération complète du espace de hachage intermédiaire (ou au moins presque plein.)
Au risque de déclarer l'évidence, assurez-vous que vous transmettez via POST, et non via GET :-) Les GET seront en clair.
De plus, pendant que nous parlons de problèmes tels que POST vs GET, assurez-vous de mettre en œuvre la confidentialité de transfert afin que vos sessions sécurisées ne puissent pas être déchiffrées plus tard par quelqu'un qui obtient la clé privée de votre serveur.
Conversation mot de passe / hachage [suite dans le chat] (http://chat.stackexchange.com/rooms/16227/discussion-between-aj-henderson-and-craig).
Surtout avec une application côté client, j'utiliserais probablement encore une version hachée du mot de passe sur la ligne, car je pense qu'il est possible que, pour une raison quelconque, une connexion non chiffrée puisse être créée (par une erreur de programmation, une mise à jour d'application défectueuse , mauvais paramètres de la bibliothèque sous-jacente, donc une redirection vers un serveur http est acceptée ...) * Tout cela pour le cas du même mot de passe pour plusieurs comptes, en outre, vous êtes à l'abri d'une personne ayant accès à votre serveur pour obtenir des mots de passe en clair ...
@Falco - et une erreur de programmation pourrait également rendre le hachage non sécurisé. Vous devez valider le comportement du code lié à la sécurité, pas seulement espérer qu'il fonctionne correctement. Plus vous ajoutez de complexité à un système, plus il est difficile à valider et plus une erreur ou une vulnérabilité est susceptible d'apparaître. Vous devez juger du bénéfice que vous obtenez pour un effort supplémentaire donné. Finalement, le risque supplémentaire d'erreur dans la mise en œuvre ne vaut pas le gain minimal de résistance supplémentaire.
@AJHenderson: Vous dites "Oui, c'est la pratique courante." Avez-vous une référence pour faire cette déclaration? Je recherche les meilleures pratiques d'une source d'autorité bien connue, comme peut-être le NIST ou même un livre O'Reilly.
Cette «pratique standard» assure-t-elle également une sécurité complète si nous avons «goto fail» ou «HTTPS freak» dans le cadre de notre communication? Et si deux versions SSL sont cassées, sommes-nous sûrs que la version récente est sûre?
@h22 Je suppose que nous ne pouvons pas être sûrs à 100%, mais si ce n'est pas le cas, les mots de passe sont la moindre de nos préoccupations. En outre, nous sommes beaucoup plus sûrs de TLS que de certaines configurations de hachage ou de chiffrement côté client. Si vous dites que cela relève de la pratique «ne roulez pas vous-même».
«Le cryptage local» ne sonne pas vraiment bien mais il existe également des bibliothèques de cryptographie standard.
@h22, le cryptage maison ne s'applique pas seulement aux algorithmes ou bibliothèques, mais aussi aux protocoles. Un échange de mot de passe peut échouer de nombreuses manières. Par exemple, si vous faisiez un chiffrement côté client sans qu'un défi différent soit envoyé au client à chaque fois, le chiffrement ne ferait rien du tout car il ne ferait qu'obscurcir les moyens de générer un mot de passe qui ne serait protégé que par ssl (puisque le la valeur générée par le client serait toujours la même, ce qui en fait le "vrai" mot de passe) Il existe toutes sortes de pièges potentiels, à la fois évidents et non évidents.
Le fait demeure qu'il y a beaucoup plus de tests et d'analyses de protocoles comme ssl que tout ce que vous composez comme votre propre suite. Si vos propres trucs sont superposés à d'autres trucs, cela peut produire des attaques de canaux secondaires. Le fait qu'il ait fallu si longtemps pour que les problèmes soient découverts dans SSL devrait être un générateur de confiance. Cela signifie que même avec une tonne d'yeux, les vulnérabilités sont difficiles à trouver. De plus, cela signifie que des problèmes sont trouvés et annoncés par des chercheurs qui se penchent sur ce genre de choses.
Est-ce toujours une bonne réponse?Je ne m'attendrais pas;certains endroits installent des certificats supplémentaires et effectuent des attaques HTTPS MitM, par exemple.J'ai vu ailleurs des discussions sur ce qui devrait être un meilleur système, mais pas assez pour que je puisse juger si c'était par des gens qui comprenaient réellement la sécurité.
@DanielH si quelqu'un a accès pour installer les certificats racine, ils ont accès au journal des clés.Si vous ne faites pas confiance à un ordinateur, n'entrez pas votre mot de passe, point final.La protection contre les clients compromis nécessite un mécanisme entièrement différent, tel que des cartes à puce qui peuvent s'authentifier sans révéler le secret, mais qui nécessite du matériel supplémentaire pour le client et n'est pas pratique pour la plupart des applications.
@AJHenderson Il existe des moyens d'amener un client à avoir un certificat compromis qui ne vous permet pas d'installer un keylogger, mais je retire cette partie de mon objection de toute façon car ils vous laisseraient également changer l'écran de connexion et peu de clients vérifierontque chaque fois pour des changements.Cela ne protégerait que contre les compromis de serveur partiels mais non totaux (qui peuvent ou non être plausibles selon l'architecture et les pratiques de sécurité de l'entreprise) ou les attaques qui ont permis l'écoute passive mais pas d'interférence active avec HTTPS (peut probablement exister, mais très rare).
@AJHenderson Bien que la plupart de ce qui m'a convaincu, c'est que plusieurs entreprises en qui j'ai confiance pour avoir une sécurité supérieure à la moyenne semblent toutes envoyer le mot de passe entré d'une manière non cryptée au-delà du HTTPS.Je suis surpris;Je me serais attendu à ce qu’une méthode qui ne fasse pas cela devienne la norme pour l’amélioration peut-être minime qu’elle offre, d’autant plus que la lutte contre la réutilisation des mots de passe est une bataille perdue.
@DanielH comment installeriez-vous un certificat racine de confiance sans avoir accès administrateur à la boîte pendant au moins une courte période?Si vous avez ce niveau d'accès, vous pourriez également être néfaste de plusieurs autres manières si vous le vouliez.Et comme vous l'avez souligné à juste titre, le simple fait d'avoir la capacité MitM signifie que tout mécanisme côté client pourrait être vaincu à moins qu'il ne soit intégré à une application plutôt qu'à un site Web.
@AJHenderson Vous pouvez compromettre un certificat, soit sans être remarqué, soit en effectuant l'attaque avant sa révocation.Vous pouvez cibler les clients qui ont encore le certificat [Superfish] (https://en.wikipedia.org/wiki/Superfish), ou un équivalent de l'un des multiples autres utilitaires qui font quelque chose de similaire.Vous pouvez vendre un boîtier de médiation ou un middleware de filtrage de contenu qui aurait une raison valable pour MitMing, puis soit ne pas protéger le certificat, soit l'utiliser à des fins néfastes.Vous pouvez inciter une autorité de certification à vous délivrer un certificat pour un site que vous ne contrôlez que partiellement.Etc.
@DanielH ok, c'est un contexte complètement différent de votre commentaire initial parlant des endroits qui installent des certificats pour le proxy MitM.Les cas que vous venez de décrire sont beaucoup moins courants et la plupart ont des mesures d'atténuation en place maintenant ou sont des cas très rares ou ne s'appliquent qu'aux systèmes qui sont autrement vulnérables aux attaques contre le client lui-même.
Laissez-nous [continuer cette discussion dans le chat] (https://chat.stackexchange.com/rooms/90709/discussion-between-daniel-h-and-aj-henderson).
Neil McGuigan
2014-08-04 22:26:15 UTC
view on stackexchange narkive permalink

Pas nécessairement.

Vous devez également vous assurer de ce qui suit:

  1. Votre site est protégé contre les falsifications de requêtes intersites. Utilisez Synchronizing Token Pattern.

  2. Votre site est protégé contre les attaques de fixation de session. Modifiez l'identifiant de session lors de la connexion.

  3. Si vous utilisez des cookies de session, que votre site entier est HTTPS, pas seulement l'URL de connexion, et que votre cookie de session est marqué comme sécurisé et http uniquement (pas d'accès JavaScript). Le navigateur enverra un cookie de session non crypté si l'utilisateur tape http: // yoursecuresite (dans la même session de navigateur).

  4. Vous utilisez un protocole récent. SSL 1 et 2 sont cassés, et 3 pourrait l'être aussi. Essayez d'utiliser TLS 1.1 ou 1.2.

  5. Vous utilisez un chiffrement fort.

  6. Vous n'utilisez pas la compression HTTP (GZip) ou TLS. Si votre site affiche une entrée utilisateur (comme une entrée de recherche), je peux déterminer vos jetons CSRF et votre numéro de compte bancaire si vous utilisez la compression.

  7. Votre serveur ne le fait pas autorisez la renégociation des clients non sécurisés.

  8. Vous utilisez une clé RSA de 2048 bits (ou l'équivalent pour une clé EC), et personne d'autre ne connaît votre clé privée.

  9. Vous utilisez HSTS, donc le navigateur passe directement à https même si l'utilisateur tape http

  10. Vous utilisez le secret de transmission parfait. vos communications historiques sont sécurisées même en cas de fuite de votre clé privée

si l'ensemble du site est https, ai-je encore besoin d'un cookie marqué comme sécurisé? Ils seraient toujours cryptés «gratuitement» grâce à la couche TLS, non?
Pouvez-vous expliquer le point 6? Pourquoi la compression rendrait la connexion moins sécurisée?
Ya vous voulez toujours un cookie sécurisé, http uniquement, car il est toujours volable sinon. Voir xss. La compression tue le cryptage. Voir les attaques BEAST et CRIME.
@Emiliano:, même votre site est uniquement HTTPS, un attaquant peut configurer une attaque de type homme au milieu et configurer un faux serveur qui utilise le simple HTTP, en effectuant ce que l'on appelle le stripping SSL. Le navigateur enverra au faux serveur le cookie de l'utilisateur. Pour atténuer cela, vous avez besoin de cookies sécurisés et d'une politique HSTS.
9. Utilisez PFS pour atténuer le risque que quelqu'un (par exemple un gouvernement pervers) vole vos clés privées.
8. c'est tout l'intérêt du HTTPS ... 1. pas pertinent pour le client mobile, il est peu probable qu'il y ait des cookies et des sessions. 6. Quel est le problème avec les compressions? - typiquement, un serveur desservant des services json exigerait que toutes les demandes soient authentifiées.
@njzk 1. Les URL seront toujours consultables dans un navigateur, elles sont donc pertinentes. 3. Dépend de sa mise en œuvre, il vaut la peine d'être mentionné de toute façon. 6. voir les attaques BEAST et CRIME.
@NeilMcGuigan: Est-il possible de deviner la longueur du mot de passe s'il est envoyé en clair via HTTPS?
@user2284570 "In the clear" et over "HTTPS" sont opposés.
@NeilMcGuigan: Je voulais dire par ne pas les transmettre par hachage ou extra-cryptage.
mricon
2014-08-04 19:07:11 UTC
view on stackexchange narkive permalink

Tant que vous vérifiez la validité du certificat, c'est parfaitement bien et cela se fait tout le temps.

kasperd
2014-08-04 19:15:11 UTC
view on stackexchange narkive permalink

La plupart des sites généralement considérés comme sécurisés adoptent à peu près l'approche que vous décrivez. Ou en d'autres termes, vous avez simplement décrit la norme industrielle établie.

Je recommanderais de ne pas utiliser une approche moins sûre que celle que vous mentionnez. (Je ne veux pas aborder la question de savoir si bcrypt est meilleur ou pire que les autres hachages salés. N'utilisez simplement rien de plus faible qu'un hachage salé.)

Si vous voulez vous distinguer comme ayant sécurité au-dessus des normes établies de l'industrie, il existe d'autres options disponibles. Mais cela demande un effort énorme dans tous les domaines de votre application pour que cela en vaille la peine.

Les domaines concernant la validation des mots de passe qui pourraient être plus sécurisés incluent:

  • Protection du serveur contre DoS attaques en déchargeant la majeure partie du calcul lors de la validation vers le client. C'est à dire. ne pas itérer le hachage côté serveur, seulement itérer côté client et effectuer la dernière étape du hachage sur le serveur.
  • Protection contre les fuites de mot de passe si le serveur est compromis en dérivant une paire de clés publiques à partir du mot de passe et jamais laissez le serveur voir le mot de passe ou la clé secrète.
Andy Boura
2014-08-05 12:46:40 UTC
view on stackexchange narkive permalink

Comme d’autres l’ont dit, il s’agit d’une approche standard.

Cependant, pour un site personnel, je ne le suivrais pas nécessairement ... J'utiliserais une connexion fédérée de Facebook, Google ou similaire, car je n'ai pas à gérer les problèmes de cycle de vie des comptes, et peut utiliser Google 2 factor Auth etc.

Cela évite d'avoir un certain nombre de formulaires et de champs dans votre base de données, ce qui signifie moins de problèmes.

Bien sûr, vous devrez toujours autoriser les utilisateurs auxquels vous souhaitez pouvoir accéder soit via une fonction du fournisseur d'authentification comme un groupe Facebook, une sorte de liste blanche des utilisateurs autorisés ou un travail d'approbation sortir de votre compte. Parfois, cela se fait en invitant des utilisateurs: en leur donnant une URL contenant un code sécurisé unique et en reliant votre système à un fournisseur d'authentification lors de la première connexion. Les utilisateurs peuvent également effectuer une authentification et demander l'accès. Cela les place dans un état «en attente». Vous fournissez ensuite une interface où vous pouvez vous connecter et les approuver.

Bit je ne veux pas que tout le monde rejoigne: je veux donner la permission uniquement à certains utilisateurs (par exemple mes amis).
Oui, vous avez besoin d'une liste d'e-mails encore autorisés. Vous vérifiez ensuite cela par rapport à l'ID fédéré.
Ah, donc je peux mettre en place une liste blanche, tu veux dire? C'est intéressant, je vais également examiner cette approche.
C'est vrai. Vous pourriez même utiliser votre liste d'amis Facebook ou un groupe pour Auth, mais je ne connais pas les détails de la façon dont vous le feriez.
Ajout d'informations supplémentaires sur l'autorisation pour répondre.
200_success
2014-08-05 21:33:55 UTC
view on stackexchange narkive permalink

HTTPS rend la demande d'authentification insniffable en transit. Cependant, pour le rendre «sûr», il y a d'autres choses que vous devez également faire correctement. Par exemple:

  • La page de connexion entière et toutes ses dépendances devraient également avoir été servies via HTTPS, même si aucun mot de passe n'est alors transmis. Servir n'importe quelle partie de celle-ci (comme JavaScript, CSS ou des ressources d'image) sur HTTP non chiffré permettrait à un attaquant de modifier l'apparence ou le comportement de la page de connexion via une attaque de type "man-in-the-middle".

    Les navigateurs traiteront le contenu mixte HTTP / HTTPS avec divers degrés de suspicion. Certains supprimeront simplement l'icône "verrouiller" dans l'interface utilisateur. Les navigateurs plus paranoïaques refuseront de charger complètement les ressources dépendantes non chiffrées. Dans tous les cas, vous devez diffuser l'intégralité de la page de connexion via HTTPS.

  • Ne soumettez pas le mot de passe dans la chaîne de requête d'un HTTP GET. Les serveurs Web sont généralement configurés pour consigner les URL des demandes, qui incluraient la partie chaîne de requête de l'URL. Mettez le mot de passe dans un corps POST à ​​la place. (Vous pouvez également utiliser l'authentification HTTP RFC 2617, mais la prise en charge de la déconnexion est irrégulière.)

Ah oui, je me souviens toujours que GET est une mauvaise idée car il est visible sur le système client et peut finir dans l'historique du client, mais oubliez que les serveurs peuvent aussi enregistrer les paramètres.
h22
2015-10-27 17:39:55 UTC
view on stackexchange narkive permalink

Wikipédia qui contient la page complète des problèmes de sécurité HTTPS historiques.

Des bogues de sécurité HTTPS se sont déjà produits (pourquoi les deux anciennes versions sont-elles cassées? Et qu'est-ce que 'goto fail '? Qu'est-ce que' https freak '?).

Je ne suggère pas d'abandonner HTTPS, mais placer quelque chose de plus en dessous ne fera aucun mal dans la plupart des cas. Si vous pouvez déjà envoyer un mot de passe non chiffré via ce canal, vous pouvez probablement envoyer ce que vous voulez.

D.H.
2015-10-28 18:16:09 UTC
view on stackexchange narkive permalink

L'utilisation de HTTPS n'empêche pas les tentatives de forcer le mot de passe. Donc, si vous lancez la gestion de votre propre compte utilisateur, vous voudrez peut-être envisager des fonctionnalités telles que la complexité minimale du mot de passe et le verrouillage du compte / le nombre maximal de tentatives qui atténueraient de telles tentatives.



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...