Question:
Techniques pour sécuriser une page de connexion sans utiliser SSL
user3535688
2014-11-29 18:44:52 UTC
view on stackexchange narkive permalink

Je développe une page Web où les gens peuvent écrire et commenter des choses (aucune information personnelle requise) et j'ai besoin de mettre un formulaire de connexion pour que les utilisateurs puissent voir toutes leurs actions sur ma page Web. Mon idée est de programmer un formulaire de connexion sans SSL et de permettre également aux gens de se connecter avec Facebook s'ils le souhaitent. La page ne se chargera complètement que si JavaScript est activé.

  1. Mon premier problème est de m'assurer que personne ne peut voler les informations d'identification de l'utilisateur en agissant comme un homme au milieu. J'ai pensé à le résoudre avec un premier hachage côté client avec JavaScript puis côté serveur, si je reçois des valeurs hachées (au cas où quelqu'un supprime du JavaScript), un deuxième hachage et stocker ces valeurs hachées dans la base de données utilisateur. Est-ce un moyen sûr de le mettre en œuvre? De plus, y a-t-il des chances que certaines données soient perdues? Si oui, comment puis-je savoir si les données reçues ne sont pas compromises?

  2. Protégez-vous des attaques par dictionnaire et par force brute. Je le résoudrais en comptant le nombre de tentatives de connexion infructueuses associées à ce compte d'utilisateur et s'il est supérieur à 8-10 consécutifs, afficher un CAPTCHA à chacune des connexions suivantes et également mettre en œuvre un délai entre les tentatives de connexion successives . Je pense que de cette manière, les changements d'IP ne seront pas un problème car je compte le nombre d'échecs de connexion côté serveur (je définirais une variable utilisateur en PHP).

  3. Le formulaire de connexion. Je l'ai implémenté de cette manière (sans le hachage pour l'instant):

    <input id = "username" name = "userName" placeholder = "Username" type = "text" ><input id = "password "name =" pass "placeholder =" Password "type =" password ">

    Mais quand le formulaire est envoyé sur l'URL je peux lire le mot de passe comme: /LogIn.php?userName = user&pass = pass Comment puis-je masquer le mot de passe?

Quels pourraient être d'autres bons conseils, pour obtenir autant de sécurité que possible sans utiliser SSL?

Voler un identifiant est le moins qu'ils puissent faire. MiTM signifie qu'ils peuvent faire à peu près n'importe quoi - remplacer les données envoyées à votre serveur, remplacer les données provenant de votre serveur ... si vous perdez la connexion Facebook d'une manière ou d'une autre, j'imagine que les gens seront très ennuyés contre vous. Pour votre numéro 3, vous envoyez probablement des choses comme une demande `GET` au lieu d'une demande` POST` (ce que vous n'êtes pas censé faire pour cette raison).
davide - pourquoi ne voulez-vous pas utiliser SSL / TLS? Cela peut nous aider à comprendre ce que vous recherchez, car TLS est exactement ce que vous devez utiliser en fonction du contexte de votre question jusqu'à présent.
D'après vos réponses, TLS / SSL est un must. Existe-t-il des services d'hébergement Web gratuits, bons et pas si chers, voire meilleurs, qui offrent SSL / TLS?
http://startssl.org/ propose des certificats SSL de base gratuitement.
Vous semblez essayer de vous protéger contre la fuite ou la modification de la réponse de l'utilisateur à votre serveur, mais vous n'avez rien fait pour vous protéger contre les données envoyées * de * votre serveur * à * l'utilisateur en cours de modification. Si une personne malveillante a la possibilité de changer la page (même pour un utilisateur), elle peut changer la page pour envoyer le mot de passe haché à votre serveur, * et aussi * envoyer le mot de passe non haché au serveur de l'attaquant. Peu importe la qualité de votre fonction de hachage si l'attaquant connaît déjà le mot de passe.
Veuillez noter qu'avec les services SSL gratuits tels que StartSSL, vous devez souvent payer si vous devez révoquer votre certificat, par exemple dans le cas de HeartBleed.
Il pourrait donc être judicieux de dire que cette question revient à demander «Techniques pour traverser le pays sans utiliser de voiture». Là où une réponse pourrait être "utiliser un tracteur"
Sept réponses:
DTK
2014-11-29 19:39:00 UTC
view on stackexchange narkive permalink

Pourquoi refusez-vous d'utiliser TLS? Cela fonctionne, il a un bon bilan (à part quelques exceptions mineures). Refuser d'utiliser de bons outils sans raison impérieuse n'engendre pas de confiance et ne suggère pas immédiatement du professionnalisme.

De plus, ne lancez pas votre propre système d'authentification. C'est idiot et vous ferez des erreurs. Au lieu de cela, puisque vous vous attendez à ce que vos utilisateurs aient un compte Facebook, utilisez OAuth2 pour consommer une identité et une authentification fédérées. Mieux encore, sous-traiter cela à un service de fédération qui l'a maîtrisé et fournit même des extraits de code ( https://oauth.io/ vient à l'esprit).

Ne vous compliquez pas la vie.

Si l'OP a besoin de faire valoir auprès de son patron le paiement d'un certificat, il doit préciser que dans l'ensemble, essayer de lancer sa propre volonté ** coûtera plus cher ** que simplement acheter un certificat et le configurer. (C'est vrai en termes de temps et de risque.)
@jpmc26 C'est très bien mis
@jpmc26 Alors, que diriez-vous du coût de mise en œuvre et de configuration d'un protocole Web of Trust et que le système d'exploitation achète le support de votre système? 1 billion de dollars?
@Aron Je pense qu'il suffit de dire "plus que le budget du projet du PO".
Je suppose que cela dépend de ce que l'on entend exactement par «rouler soi-même».Dans les communautés Ruby on Rails / Phoenix (Elixir), il semble assez courant de créer des solutions d'authentification personnalisées basées sur des bibliothèques cryptographiques fiables telles que BCrypt, au lieu d'utiliser des bibliothèques d'authentification tierces qui pourraient être trop gonflées / restrictives.
goodguys_activate
2014-11-29 18:55:39 UTC
view on stackexchange narkive permalink

Les certificats SSL / TLS seront gratuits d'ici le deuxième trimestre 2015. Obtenez le certificat ici:

https://letsencrypt.org/

Let's Encrypt proposera gratuitement des certificats validés par le domaine signés via IdenTrust.

Lorsque cela sera mis en ligne, ces questions devraient être fermées, à mon humble avis

Pouvez-vous s'il vous plaît ajouter le prix des prix SSL / TLS maintenant?
Ce n'est pas le premier service à proposer gratuitement des certificats TLS de base. Il y a, par exemple, [StartSSL] (https://www.startssl.com/?app=39) qui offre des certificats gratuits pendant un certain temps.
De plus, "va en direct" n'est pas la même chose que "est reconnu par la grande majorité des agents iser installés"
@HagenvonEitzen [Ce tweet] (https://twitter.com/letsencrypt/status/535473089929154560) pourrait vous intéresser.
@makerofthings7: Je ne pense pas que les programmes clients coderont en dur https://letsencrypt.org. Ce serait donc inutile.
@user2284570 Lisez le tweet user10008 lié au-dessus de votre commentaire.
Mais alors le problème devient le coût marginal d'une mise à niveau de l'hébergement HTTP uniquement vers l'hébergement HTTPS, ainsi que la façon d'accueillir les clients sur des navigateurs ignorant SNI (principalement Internet Explorer sur Windows XP et Android 2.x).
@tepples: Toutes ces autorités de certificats gratuits sont pour les particuliers. Si vous exécutez un service commercial et / ou que vous devez faire des choses sérieuses comme impliquer des multi-domaines, vous devrez acheter un certificat.
@tepples AFAIK la [spécification acme] (https://github.com/letsencrypt/acme-spec/blob/master/draft-barnes-acme.txt) permet des certificats avec plusieurs noms DNS: chaque clé peut être autorisée pour plusieurs domaines , et chaque CSR peut inclure plusieurs domaines.
user10211
2014-11-29 18:47:08 UTC
view on stackexchange narkive permalink

Quels autres bons conseils pourraient être pour obtenir autant de sécurité que possible sans utiliser SSL?

Vous pouvez utiliser TLS au lieu de faire quelque chose de stupide.

-1 TLS est la nouvelle version de SSL. Les gens veulent généralement dire TLS par «SSL».
+1 @kinokijuf - Je suis sûr que Terry le sait. Le point est: utilisez l'une des technologies existantes plutôt que d'essayer de lancer la vôtre.
Yogu
2014-11-30 19:19:20 UTC
view on stackexchange narkive permalink

Ce que vous essayez de faire est impossible sans un moyen sécurisé d'envoyer vos fichiers au client, tel que TLS. Vos approches de hachage du mot de passe côté client nécessitent que le javascript soit envoyé en toute sécurité au client. Sinon, un MITM pourrait simplement servir un script qui ne hache pas le mot de passe, mais leur envoie plutôt le mot de passe en texte clair directement.

La partie importante est que vous avez besoin de code de confiance sur le client . Avec TLS, ce code de confiance est le navigateur, qui à son tour vérifie l'intégrité de votre javascript pour le rendre également fiable. Sans vous fier à cela ou à quelque chose d'équivalent (que je ne connais pas), vous ne pouvez pas faire d'hypothèses sur ce qui fonctionne sur la machine du client.

Et pour éviter cela, il faut essentiellement réinventer TLS.
@Mark Mon point est qu'il est * impossible * de réinventer TLS ou quelque chose de similaire dans le javascript de votre page Web.
@Yogu Je ne dirais pas impossible, mais il serait très coûteux de le faire correctement, et il faudrait presque certainement des années de correction de bogues avant qu'il ne soit proche de la bonne. De plus, comme il n'aurait pas l'adoption généralisée de SSL / TLS / IPSec, il n'aurait pas la surveillance de trouver des bogues pour lui.
@DTK: Si ce n'est pas impossible, comment vous assurer que le code que vous avez écrit s'exécute réellement sur la machine du client, si le transport des scripts n'est pas fiable?
@Yogu À ce stade, vous avez la partie distribution de la question de la chaîne d'approvisionnement numérique et la fourniture d'une solution aux points finaux via un mécanisme de confiance. Étant donné que l'implémentation TLS est fournie avec le navigateur, si vous faites confiance au canal pour recevoir le navigateur, vous pouvez faire confiance à l'implémentation TLS. Je ne dis pas que c'est une bonne position. Bref, ne réinventez pas TLS et cherchez une bonne façon de le distribuer.
Je ne suis pas sûr de comprendre quelle serait la différence entre le chiffrement au niveau de la couche de transport et celui d'une autre couche. Il n'y a rien de spécial à propos de la sécurité AFAICT «couche transport».
@Mehrdad: Désolé pour la confusion, je ne parlais pas spécifiquement de TLS. Il est important que le * transport * des scripts soit sécurisé afin que vous sachiez qu'ils sont arrivés sans erreur chez le client.
@Yogu: Je ne parlais pas non plus spécifiquement de TLS, c'est pourquoi j'ai écrit * "transport-layer" security * au lieu de * TLS *. Ma question tient toujours.
@Mehrdad J'ai édité la partie * sécurité de la couche de transport *. Je ne parlais pas de la couche de transport OSI *, donc c'était déroutant.
Buge
2014-12-01 03:09:26 UTC
view on stackexchange narkive permalink

Le seul moyen d'être sécurisé sans TLS est un plugin de navigateur, qui doit être téléchargé ... via TLS. Et un plugin de navigateur est un énorme inconvénient en termes d'utilisation.

La raison en est qu'il doit y avoir un code de confiance sur l'ordinateur de l'utilisateur. Cela peut être soit le code TLS dans le navigateur de l'utilisateur, soit le code du plugin.

user2813274
2014-11-29 22:05:34 UTC
view on stackexchange narkive permalink

Les autres réponses sont claires - utilisez SSL

cependant, pour indiquer ce qui échouerait si vous l'implémentiez comme décrit:

J'ai pensé à le résoudre avec un premier hachage côté client avec JavaScript, puis côté serveur, si je reçois des valeurs hachées (au cas où quelqu'un supprime du JavaScript), un second hachage et stocker ces valeurs hachées dans la base de données utilisateur. Est-ce un moyen sûr de le mettre en œuvre? De plus, y a-t-il des chances que certaines données soient perdues? Si tel est le cas, comment puis-je savoir si les données reçues ne sont pas compromises?

donc dans ce scénario, un MITM recevrait le hachage envoyé par le client - s'il s'agissait d'une connexion ou similaire, ils peuvent le copier, puis l'envoyer chaque fois qu'ils souhaitent se connecter en tant que X. Risque de perte de données? avec un MITM, il est fondamentalement garanti que certaines données peuvent être perdues - la question est de savoir si vous pourrez les détecter? quant à savoir comment savoir que les données reçues ne sont pas compromises, la manière typique serait de les signer.

Si vous ne devez vraiment pas utiliser SSL, vous pouvez le retirer en toute sécurité via WS Security à la place, mais attention, cela va être plus compliqué que le simple SSL.

Protégez-vous des attaques par dictionnaire et par force brute.

En général, ils peuvent être vaincus comme vous l'avez décrit, mais les fois où vous devez vraiment vous soucier de la force brute les attaques sont des attaques hors ligne - c'est-à-dire lorsque votre code n'est pas en cours d'exécution et ne peut pas protéger les données en limitant la fréquence des tentatives de connexion - de nombreux cycles de hachage sont nécessaires pour le faire

Le formulaire de connexion . Je l'ai implémenté de cette manière (sans le hachage pour le moment)

Quelle serait exactement la différence pour un attaquant s'il voyait une URL hachée ou une charge utile hachée des mêmes données? de toute façon, si vous ne voulez pas les données dans l'URL, utilisez un HTTP POST au lieu d'un HTTP GET

WS-Security est-il pris en charge par n'importe quel navigateur? S'il n'est pas déjà intégré au navigateur, la sécurité ne peut jamais être meilleure que la méthode utilisée pour envoyer le code au navigateur.
@kasperd, il doit être implémenté via javascript - bien qu'il ne soit pas sécurisé contre le client, il protège contre une attaque MITM. Il existe une [bibliothèque] javscript (http://www.codeproject.com/Articles/373317/Ws-js-A-Ws-implementation-for-Node-js) pour vous aider. Comme je l'ai dit cependant, faire fonctionner cela (correctement) sera beaucoup plus compliqué que la simple mise en œuvre de SSL.
Non, il ne protège pas contre les attaques mitm. Rien de ce que vous implémentez en javascript ne peut vous protéger contre les attaques mitm. Soit vous utilisez SSL pour vous protéger contre les attaques mitm, auquel cas la protection est assurée par SSL et non par votre code javascript. Ou vous n'utilisez pas SSL, auquel cas votre code javascript ne protège pas non plus contre les attaques mitm, car le code javascript pourrait être falsifié.
Point @kasperd pris - si le code javascript était signé, le navigateur aurait besoin d'avoir la fonctionnalité de vérification des signatures, qui consiste simplement à recréer SSL ...
Steve Sether
2014-12-27 04:16:56 UTC
view on stackexchange narkive permalink

Il existe en fait un système d'authentification "sécurisé" sur le Web qui est antérieur à SSL appelé Authentification d'accès numérique, donc ce que l'interrogateur demande n'est pas tout à fait impossible. Ceci est BEAUCOUP moins sécurisé que SSL, et est sujet au forçage brutal du mot de passe par des attaques hors ligne, ainsi qu'à l'utilisation d'un ancien algorithme de hachage MD5 peu fiable.

Je donnerais toujours le même conseil que tout le monde cependant, et vous dire que SSL est de loin la meilleure solution que de compter sur un système obsolète basé sur des défis-réponses qui n'a pas été mis à jour depuis 1993.



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