web-dev-qa-db-fra.com

Est-il sûr d'envoyer des noms d'utilisateur / mots de passe clairs sur une connexion https pour authentifier les utilisateurs?

Je configure 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 simple mécanisme 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 filshark/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 possède également une base de données de nom d'utilisateur/mot de passe (les mots de passe peuvent être enregistrés 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 crypté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 à celui stocké dans la base de données

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

104
Emiliano

Oui, c'est la pratique standard. Faire autre chose que cela offre un avantage supplémentaire minimal, 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 en déguisant 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 que si la connexion SSL était compromise et si la connexion SSL était en quelque sorte compromise, le jeton "déguisé" serait toujours tout ce qui est nécessaire pour accéder au compte, donc il ne sert à rien de protéger le mot de passe plus loin. (Il offre 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é pour commencer.)

Comme l'a souligné MyFreeWeb, il existe également des systèmes élaborés qui peuvent utiliser une réponse de défi pour garantir que le mot de passe est conservé par le client, mais ceux-ci sont vraiment élaborés et peu utilisés du tout. Ils ne fournissent également pas beaucoup d'avantages supplémentaires car ils protègent uniquement le mot de passe contre toute compromission sur un serveur activement piraté.

78
AJ Henderson

Pas nécessairement.

Vous devez également vous assurer des éléments suivants:

  1. Votre site est protégé contre les contrefaçons de demande intersites. Utilisez le modèle de jeton de synchronisation.

  2. Votre site est protégé contre les attaques de fixation de session. Changer 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 chiffré 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 pourraient 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 la compression 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 n'autorise pas la renégociation client non sécurisée.

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

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

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

20
Neil McGuigan

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

15
mricon

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

Je déconseille d'utiliser une approche moins sûre que celle que vous mentionnez. (Que bcrypt soit meilleur ou pire que les autres hachages salés est une discussion dans laquelle je n'entrerai pas. N'utilisez simplement rien de plus faible qu'un hachage salé.)

Si vous souhaitez vous distinguer comme ayant une sécurité supérieure aux normes établies de l'industrie, d'autres options sont disponibles. Mais il faut 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 comprennent:

  • Protéger le serveur contre les attaques DoS en déchargeant la plupart des calculs lors de la validation sur 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 de 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 du mot de passe et ne laissez jamais le serveur voir le mot de passe ou la clé secrète.
7
kasperd

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 de cette façon, je n'ai pas à gérer les problèmes de cycle de vie du compte, et je peux utiliser Google Factor Auth, etc. .

Cela vous évite d'avoir plusieurs formulaires et 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 via une fonction du fournisseur d'authentification telle qu'un groupe Facebook, une sorte de liste blanche des utilisateurs autorisés ou un flux de travail d'approbation de votre compte. Parfois, cela se fait en invitant les utilisateurs: en leur donnant une URL contenant un code sécurisé unique et votre système le liant à un fournisseur d'authentification lors de la première connexion. Les utilisateurs peuvent également authentifier 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.

4
Andy Boura

HTTPS rend la demande d'authentification non transitoire 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) via 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 HTTP/HTTPS mixte avec différents degrés de suspicion. Certains supprimeront simplement le ???? icône "cadenas" dans l'interface utilisateur. Plus de navigateurs 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 enregistrer les URL des demandes, ce qui comprend 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 RFC 2617 l'authentification HTTP, mais la prise en charge de la déconnexion est irrégulière.)

2
200_success

Wikipedia qui a le pleine page 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 cassées? Et qu'est-ce que 'goto fail'? Qu'est-ce que 'https freak'?).

Je ne suggère pas d'abandonner le 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 crypté via ce canal, vous pouvez probablement envoyer ce que vous voulez.

0
h22

L'utilisation de HTTPS n'empêche pas les tentatives de force brute sur le mot de passe. Donc, si vous déployez votre propre gestion de compte d'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 ces tentatives.

0
D.H.