Si sur un écran de connexion l'utilisateur soumet un formulaire avec son nom d'utilisateur et son mot de passe, le mot de passe est envoyé en texte brut (même avec POST, corrigez-moi si je me trompe).
La question est donc de savoir quelle est la bonne façon de protéger l'utilisateur et son mot de passe contre le tiers qui pourrait écouter les données de communication?
Je sais que HTTPS est une solution au problème, mais existe-t-il un moyen d'assurer au moins un certain niveau de sécurité en utilisant le protocole HTTP standard (requête POST)? (peut-être en utilisant javascript d'une manière ou d'une autre)
EDIT J'ai peut-être oublié certaines choses importantes.
Ce dont je parlais était une page - c'est une page de connexion générée par PHP, qui est bien sûr envoyée à l'utilisateur dans une requête HTTP GET sous forme de fichier HTML. Il n'y a pas de connexion (@Jeremy Powel) établie entre le serveur et le client, donc je ne peux pas créer un tel protocole d'établissement de liaison. Et je veux que le processus complet soit transparent pour l'utilisateur - il veut soumettre un mot de passe, pas s'occuper de la cryptographie.
Merci.
Réponses:
Utiliser HTTP avec SSL vous facilitera la vie et vous pourrez vous reposer à l'aise. Des personnes très intelligentes (plus intelligentes que moi du moins!) Ont scruté cette méthode de communication confidentielle pendant des années.
la source
L'authentification sécurisée est un vaste sujet. En un mot, comme @ jeremy-powell l'a mentionné, privilégiez toujours l'envoi d'informations d'identification via HTTPS au lieu de HTTP. Cela enlèvera beaucoup de maux de tête liés à la sécurité.
Les certificats TSL / SSL sont plutôt bon marché de nos jours. En fait, si vous ne voulez pas du tout dépenser d'argent, il y a un letsencrypt.org gratuit - une autorité de certification automatisée.
Vous pouvez aller plus loin et utiliser caddyserver.com qui appelle letsencrypt en arrière-plan.
Maintenant, une fois que nous avons éliminé HTTPS ...
Vous ne devez pas envoyer de login et de mot de passe via la charge utile POST ou les paramètres GET. Utilisez plutôt un en-tête d'autorisation (schéma d'authentification d'accès de base), qui est construit comme suit:
Cela peut sembler un peu compliqué, mais ce n'est pas le cas. Il existe de nombreuses bonnes bibliothèques qui vous fourniront cette fonctionnalité prête à l'emploi.
Il y a quelques bonnes raisons pour lesquelles vous devriez utiliser un en-tête d'autorisation
https://user:[email protected]/login
(Chrome, par exemple, le convertira automatiquement en en-Authorization
tête)IMPORTANT:
comme indiqué par @zaph dans son commentaire ci-dessous, envoyer des informations sensibles en tant que requête GET n'est pas une bonne idée car cela finira probablement dans les journaux du serveur.
la source
Authorization
tête. Essayez-le. Les journaux rappelleront propre. Et bien sûr, si vous passez un appel depuis le serveur (si c'est le scénario qui vous préoccupe), vous devez bien sûr générer un en-tête par programme.username:password@url
du navigateur se traduit par:url
+ en-Authorization
tête de demande. Quant aux requêtes GET ... comme je l'ai dit, utilisez l'en-tête Authroziation. Il est préférable.Vous pouvez utiliser un schéma de réponse au défi. Dites que le client et le serveur connaissent tous deux un secret S. Ensuite, le serveur peut être sûr que le client connaît le mot de passe (sans le révéler) en:
Éditer:
Il y a un problème ici avec la fraîcheur de R et le fait que HTTP est sans état. Cela peut être géré en demandant au serveur de créer un secret, appelez-le Q, que seul le serveur connaît . Ensuite, le protocole va comme ceci:A noter, puisque H (R, Q) ne peut pas être falsifié par le client, H (R, Q) agit comme un cookie (et pourrait donc être implémenté en fait comme un cookie).Une autre modification:
La modification précédente du protocole est incorrecte car quiconque a observé H (R, Q) semble être en mesure de le rejouer avec le hachage correct. Le serveur doit se souvenir quels R ne sont plus récents. Je suis en train de préparer cette réponse pour que vous puissiez modifier cela et trouver quelque chose de bien.
la source
Si votre hébergeur le permet, ou si vous devrez gérer des données sensibles, utilisez HTTPS, point final. (C'est souvent requis par la loi afaik).
Sinon, si vous voulez faire quelque chose via HTTP. Je ferais quelque chose comme ça.
Ainsi, le mot de passe est protégé et le même hachage d'authentification ne peut pas être rejoué.
À propos de la sécurité du jeton de session. C'est un peu plus difficile. Mais il est possible de rendre la réutilisation d'un jeton de session volé un peu plus difficile.
Ainsi, si le jeton de session a été volé et qu'une demande est envoyée par quelqu'un d'autre, à la prochaine demande de l'utilisateur d'origine, la session sera détruite. Donc, si l'utilisateur navigue activement sur le site, en cliquant souvent sur des liens, le voleur n'ira pas loin avec le jeton volé. Ce schéma peut être renforcé en exigeant une autre authentification pour les opérations sensibles (comme la suppression de compte).
EDIT: Veuillez noter que cela n'empêche pas les attaques MITM si l'attaquant configure sa propre page avec une clé publique différente et envoie des requêtes proxy au serveur. Pour se protéger contre cela, la clé publique doit être épinglée dans le stockage local du navigateur ou dans l'application pour détecter ce type d'astuces.
À propos de l'implémentation: RSA est probablement l'algorithme le plus connu, mais il est assez lent pour les longues clés. Je ne sais pas à quelle vitesse une implémentation PHP ou Javascript serait. Mais il existe probablement des algorithmes plus rapides.
la source
J'utiliserais un système d'échange de clés Diffie-Hellman côté serveur et côté client avec AJAX ou plusieurs formulaires (je recommande le premier), bien que je ne vois aucune bonne implémentation de celui-ci sur Internet. N'oubliez pas qu'une bibliothèque JS peut toujours être corrompue ou modifiée par MITM. Le stockage local peut être utilisé pour lutter contre cela, dans une certaine mesure.
la source
Vous pouvez utiliser SRP pour utiliser des mots de passe sécurisés sur un canal non sécurisé. L'avantage est que même si un attaquant renifle le trafic ou compromet le serveur, il ne peut pas utiliser les mots de passe sur un autre serveur. https://github.com/alax/jsrp est une bibliothèque javascript qui prend en charge les mots de passe sécurisés via HTTP dans le navigateur ou côté serveur (via le nœud).
la source
HTTPS est si puissant car il utilise une cryptographie asymétrique. Ce type de cryptographie vous permet non seulement de créer un tunnel crypté, mais vous pouvez également vérifier que vous parlez à la bonne personne et non à un pirate informatique.
Voici le code source Java qui utilise le chiffrement asymétrique RSA (utilisé par PGP) pour communiquer: http://www.hushmail.com/services/downloads/
la source
vous pouvez utiliser ssl pour votre hôte, il existe un projet gratuit pour ssl comme letsencrypt https://letsencrypt.org/
la source
Utiliser https semble la meilleure option ici (les certificats ne sont pas si chers de nos jours). Cependant, si http est une exigence, vous pouvez utiliser une certaine inscription - encrivez-la côté serveur et décrivez-la dans le navigateur des utilisateurs (envoyez la clé séparément).
Nous l'avons utilisé lors de l'implémentation de safevia.net - l'inscription se fait du côté des clients (émetteur / récepteur), de sorte que les données des utilisateurs ne sont pas disponibles sur la couche réseau ou serveur.
la source