web-dev-qa-db-fra.com

Quelle est la meilleure façon de sécuriser un identifiant de site Web sans clés SSL ou PRE partagée?

Aujourd'hui, j'ai reniflé du trafic de WLAN non crypté pendant la classe et j'ai trouvé de nombreux mots de passe par une simple recherche de "Pass" et "utilisateur" dans Wireshark. Il appartient à environ la moitié de la moitié des sites que nous utilisons pour l'école ne chiffrent pas leurs données de quelque manière que ce soit - ils utilisent des demandes d'emploi comme? Nom d'utilisateur = user123 et mot de passe = PASSWD123 sur la connexion. J'ai commencé à y penser et maintenant je me demande; Quel est le meilleur moyen d'éviter cela? Le cryptage serait facile à inverser et une touche temporelle pourrait également être capturée. Ma meilleure pensée Jusqu'à présent, c'est pour la clientèle, mais ce serait une mauvaise idée d'une manière ou d'une autre?

Mise à jour: Je n'ai évidemment pas dit les contraintes ici, mais merci pour toutes les réponses! Le serveur n'a pas de SSL et tout ce que j'utilise doit être implémenté dans PHP/ASP/ASP.NET SERVER côté ou JavaScript sur le client. La seule clé préstentée présente est le mot de passe. Tout le reste sera connu de l'attaquant.

Je n'essaie que de cacher le mot de passe du pirate informatique. Le reste de l'information serait non crypté. Un vol de session serait donc possible. Ce sera le prochain problème. Peut-être que vous pourriez crypter les informations sur la page avec le nonond. Puisqu'il y aura beaucoup de texte crypté, une attaque de dictionnaire serait efficace. C'est pourquoi je ne veux pas utiliser le mot de passe de l'utilisateur pour le cryptage. Peut-être que je pourrais utiliser quelque chose comme un 512/1024bit XOR Key que je chiffrais avec le mot de passe de l'utilisateur? Ou une partie du mot de passe, car une attaque de dictionnaire serait toujours possible - mais plus difficile.

Une noce cryptée avec les clients dis-elle 2 premiers caractères de son mot de passe est une bonne idée? Un nombre aléatoire Xor'd avec les mots de passe 2 premiers caractères. Cela devrait être déchiffrément par l'utilisateur, car il/elle a la clé (qui serait extraite de la chaîne de mots de passe entrée via JS). La notification serait un nombre aléatoire, alors rien ne devrait pouvoir dire si cela a été correctement déchiffré.

Fondamentalement: 1. Types d'utilisateurs dans le nom d'utilisateur et les messages/obtiennent-le sur le serveur. 2. Le serveur répond avec une page avec une nondée cryptée et une boîte de mot de passe. 3. JavaScript décrypts Nounce et mot de passe devient Xor'd avec elle. 4. Le mot de passe est envoyé sur le serveur, mot de passe est déchiffré, puis haché 5. Hash est comparé à un enregistré dans la base de données.

Remarque: le serveur est gratuit et prend en charge SSL, mais je ne veux pas l'utiliser. Je n'aime pas SSL car il est cassé.

7
Filip Haglund

Vous souhaitez que le serveur cible puisse accéder au nom d'utilisateur et à un mot de passe, et non à l'attaquant alimenté par Sniffer. Donc, le serveur cible doit pouvoir faire quelque chose que l'attaquant ne peut pas. Étant donné que l'attaquant peut acheter le même type de PC que le serveur, ce pouvoir supplémentaire doit être quelque chose que le serveur sait, mais pas l'attaquant.

Hey, il est ces données: le mot de passe! C'est le point, n'est-ce pas? C'est vraiment une clé pré-partagée entre le client et le serveur.

Les mots de passe sont assez moqueurs, en ce qui concerne la clé de la clé, en raison des limites des cerveaux humains. Néanmoins, on peut travailler avec ça. Les meilleurs protocoles pour ceux-ci sont Echange de clé authentifié par mot de passe : Ils peuvent escalader une touche pare-entropie à faible entropie (mot de passe) dans une clé d'entropie à haute entraplie partagée, avec laquelle vous pouvez faire tout ce que vous pouvez faire tout ce que vous pouvez faire toutes les documents délicieux cryptographie, qui gardera (fil) des requins à la baie. Et les protocoles de Pake Pake peuvent faire cela tout en résistant Les attaques hors ligne (---) ("hors ligne" est le mot important ici).

La mauvaise nouvelle est que Pake Protocoles et, plus généralement tout protocole d'authentification pouvant être lié par la suite avec des données échangées afin que l'authentification résiste réellement attaquante active, il est difficile de se dérouler. Le protocole le plus simple mais toujours sécurisé s'avère être SSL avec SRP (il y a un [~ # ~ # ~] RFC pour cela). La bonne nouvelle est que SSL + SRP fournit une authentification mutuelle basée sur le mot de passe entre client et serveur à l'aide de Aucun certificat (et quand les gens disent qu'ils ne veulent pas Pour utiliser SSL, ce qu'ils veulent dire généralement, c'est qu'ils ne veulent pas brouiller les certificats X.509 et le friggin 'PKI Market).

Malheureusement, le support SSL + SRP n'est pas répandu ( gnoutls est une bibliothèque OpenSource qui sait SRP).

13
Tom Leek

si vous utilisez le HASH côté client, il devient un mot de passe de site réel et que vous n'avez rien réalisé.

7
AaronS

Le meilleur moyen est de tiliser SSL. Le mécanisme existe pour une raison. Les systèmes alternatifs ont tendance à être non sécurisés ou incroyablement complexes.

Vous avez dit que vous vouliez le faire sans utiliser SSL, mais vous n'avez donné aucune raison ni raison pour laquelle. Vous n'avez pas expliqué la situation dans laquelle vous êtes dans ou ce qui justifierait d'éviter SSL. Par conséquent, même si nous voulions vous fournir des suggestions alternatives, il serait impossible de déterminer si elles répondent à vos exigences.

7
D.W.

Si tout ce que vous souhaitez authentifier l'utilisateur au serveur (et ne vous souciez pas de crypter les données ultérieures), le hachage de la LLPORT serait facile à mettre en œuvre car il existe déjà des bibliothèques de fonction de hachage implémentées dans JavaScript et PHP/ASP/ASP.NET .

La HASH de LAMPORT est un type de jeu de mots de passe ponctuel qui fonctionne comme suit (Alice est l'utilisateur, Bob est le serveur):

Enregistrement initial

Lors de l'enregistrement, Alice envoie [N, hash ^ n (mot de passe)] sur le serveur (où est le résultat de hachage du mot de passe, puis de hachage le résultat de cela, puis de hachage le résultat de ce ..., N fois). Le serveur stocke [n, hash ^ n (mot de passe)] dans la base de données.

Authentification

  1. Alice envoie son identifiant (nom d'utilisateur) à Bob: "Alice"
  2. Bob répond avec "n"
  3. Alice envoie x = hash ^ {n-1} (mot de passe) à bob
  4. BOB compare hachage (x) avec le digest stocké dans sa base de données [.____]
    • S'ils correspondent, l'authentification réussit et Bob remplace [N, hachage ^ n (mot de passe)] avec [n-1, x = hachage ^ {n-1} (mot de passe)]
    • Sinon, l'authentification échoue et BOB conserve ce qui est dans la base de données

Considérations pratiques

  • Vous voudrez probablement utiliser un sel avec le mot de passe (Bob peut envoyer le sel dans # 2)
  • Une fois que n est assez petit, Alice devra changer son mot de passe (ou ils peuvent simplement changer le sel), et elle devra re-envoyer [n, hachage ^ n (sel + mot de passe)] à Bob
  • Choisir n assez grand de manière à ce que la réégistration ne soit pas trop souvent
  • Comme il s'agit seulement d'une authentification à sens unique (l'utilisateur est authentifié au serveur, mais le serveur n'est pas authentifié à l'utilisateur), l'homme au centre est possible.

Si le hachage de la LLPORT ne répond pas à vos exigences (par exemple, vous avez besoin d'une authentification mutuelle), SRP est probablement votre meilleur choix, mais au moment où vous l'avez implémenté dans JavaScript et PHP/ASP/ASP.NET, vous auriez pu louer un serveur qui Prend en charge SSL qui est clairement le meilleur choix depuis le début.

3
mikeazo

La réponse est TLS (pas même SSL) sans AES comme algorithme de cryptage, car il existe un problème connu avec la combinaison de TLS, de AES et de WebSockets par exemple. Tout le reste (j'aime crypter le mot de passe dans le client à l'aide de JavaScript) est insécurisé. Bien sûr, cela ne peut pas être lu direcly à l'aide de Wireshark, mais le JavaScript peut venir d'un homme au milieu. Alors essayez de convaincre votre école? pour passer aux serveurs TLS. C'est le moyen le plus simple et ne nécessitera aucun changement de code d'application.

2
esskar

SSL ne peut pas être aussi brisé que les mots de passe de texte clairs. Utilisez SSL. Je pense que Scheier a quelque chose à dire sur les personnes qui conçoivent leurs propres cryptosystèmes.

1
Mark C. Wallace

Je n'aime pas SSL car il est cassé.

C'est une revendication assez dramatique de jeter sans explication ni de référence. Voulez-vous dire toutes les formes de SSL, y compris TLS ou spécifiquement SSL V1-3?

C'est bien mieux que beaucoup d'autres tentatives de solutions au problème.

Le seul moyen d'établir une communication sécurisée est via Cryptage - et pour un client basé sur le navigateur, si vous n'utilisez pas la fonctionnalité intégrée de SSL, vous fournissez le code pour implémenter le cryptage (que ce soit JavaScript, ActiveX, Java, Flash ....) Sur une connexion non sécurisée. Par conséquent, le code peut être compromis. Peu importe que vous utilisiez la touche ROT13 ou une touche Bit 4096 avec un algorithme PFS - s'il est géré par le code livré sans précision, modifier le code pour capturer le mot de passe est facile.

Si vous pensez que SSL est cassé, puis corrigez-le - c'est une façon beaucoup plus rentable de passer votre temps.

1
symcbean

Si vous pouvez exécuter JavaScript sur le client, vous pouvez configurer un échange de clé Diffie-Helman ou un mécanisme de défi/réponse basé sur le hachage de mot de passe (ne pas stocker en clairexuant sur votre système!) Et utilisez-le pour faire un processus d'authentification fantaisie où Un identifiant crypté est renvoyé pour l'authentification.

Ceux-ci n'arrêtent pas les attaques de MITM actives, mais il conservera des attaquants passifs contre des mots de passe reniflant.

1
Jeff Ferland

La première chose que je vérifierais, c'est si le serveur prend en charge l'authentification HTTP avec l'authentification Digest. Vous pourriez être capable de l'activer via PHP.

http://www.php.net/manual/fr/features.http-auth.php

Ce n'est pas aussi sécurisé que SSL, mais cela pourrait être un truc simple pour empêcher les personnes de votre classe de glisser vos mots de passe. Utilisez HTTP Auth pour bloquer la zone du site dont vous avez besoin pour protéger. Ils verront tout ce que vous faites, mais ils n'obtiendront pas le mot de passe de l'authentification HTTP. (Ils obtiendront tout autre mot de passe à l'intérieur de la session)

0
mgjk