web-dev-qa-db-fra.com

Comment effectuer l'authentification de connexion côté client?

Comment pouvons-nous valider les identifiants de connexion côté client lui-même sans impliquer le serveur d'un site Web?

14
sanjay

Tu ne peux pas.

La raison en est que vous ne pouvez pas du tout faire confiance au client. Un attaquant peut modifier le client comme il l'entend, et contourner toutes les mesures de sécurité que vous avez mises en place.

Mais que se passe-t-il si nous signons numériquement notre code? L'attaquant ne peut pas le modifier alors, non?

Oui, ils peuvent. Si vous signez votre code, la machine de l'attaquant doit valider la signature et refuser de l'exécuter si la signature du client ne correspond pas. Rien n'empêche le client de désactiver cette vérification de signature et d'exécuter simplement du code avec une mauvaise signature ou aucune signature.

De plus, si vous ne souhaitez pas impliquer le serveur du tout après l'envoi du site Web, alors tout le contenu potentiellement confidentiel doit être envoyé au client d'abord (avant de savoir s'ils sont autorisés à le voir), puis leur a été révélé.

Rien n'empêche un attaquant de simplement regarder le contenu brut qui lui est envoyé sur le réseau, sans qu'aucun code côté client ne soit exécuté.

Mais ne pouvez-vous pas crypter les données avec les informations d'identification de l'utilisateur?

Oui vous pourriez. Mais votre objectif est d'authentifier l'utilisateur, ce qui signifie que vous confirmez si l'utilisateur est bien celui qu'il prétend être. Le schéma suggéré par user912 fonctionnerait comme suit:

  1. L'utilisateur prétend être utilisateur "foo".
  2. Le site Web chiffre la charge utile pour "foo" avec les informations d'identification de cet utilisateur, par exemple "foo: bar".
  3. L'utilisateur entre ses informations d'identification, qui déchiffrent localement la charge utile.

Ce schéma n'authentifie en aucun cas l'utilisateur auprès du serveur. Le serveur ne sait pas si l'utilisateur est vraiment "foo" ou non. De plus, si l'utilisateur a un mot de passe faible, l'attaquant peut tenter de le casser. Oui, une fonction de dérivation de clé peut ralentir ce processus, mais il s'agit essentiellement d'une fuite d'informations d'identification.


Ce que je suis curieux, c'est pourquoi vous voudriez vouloir essayer ce schéma, au lieu de la méthode testée traditionnelle?

61
MechMK1

Il existe une longue histoire de logiciels avec authentification côté client. Le meilleur exemple est probablement les systèmes d'exploitation. Microsoft Windows authentifie les utilisateurs avec un hachage NT dans un fichier spécial appelé SAM; Linux authentifie les utilisateurs avec crypt et le fichier/etc/shadow.

La conception est:

  1. Recevoir l'identifiant de l'utilisateur
  2. Recevez en toute sécurité le mot de passe de l'utilisateur
  3. Recherchez le nom d'utilisateur et recevez le sel et les tours pour cet utilisateur (facultativement, réservez ou créez des paramètres utilisateur factices pour les noms d'utilisateur non trouvés)
  4. Générez le hachage du mot de passe, en utilisant le sel, les ronds et le poivre
  5. Comparer le hachage généré avec le hachage utilisateur stocké
  6. Vérifiez si l'utilisateur est verrouillé ou d'autres critères
  7. Connectez-vous à l'utilisateur ou échouez à la connexion, en fonction des critères

Il s'agit du même flux de travail qui fonctionne dans le paradigme Web. Mais les étapes 3 à 7 fonctionnent sur le serveur et non sur le client.

0
Douglas Held