Auteur Sujet: Sécurité contre l'écoute lors de la connexion lafibre.info  (Lu 14252 fois)

0 Membres et 1 Invité sur ce sujet

corrector

  • Invité
Sécurité contre l'écoute lors de la connexion lafibre.info
« Réponse #24 le: 25 octobre 2014 à 22:14:14 »
Plusieurs commentaires rapides :

- L'idée du poivre est d'être archi-protégé, il n'apparaît jamais en BDD (donc il n'est pas attaquable via SQL, ni via une sauvegarde de la BDD), il est dans un fichier spécial auquel seul le processus d'authentification accède, si n'importe quel client peut le récupérer ça n'apporte plus rien, autant le virer, le sel suffit bien.

- Comme fonction lente, bcrypt est vieux, scrypt est plus à la mode.

- L'analyse est imparable si on se limite à la crypto symétrique.

corrector

  • Invité
Sécurité contre l'écoute lors de la connexion lafibre.info
« Réponse #25 le: 25 octobre 2014 à 23:11:28 »
SRP Protocol Design

SRP is the newest addition to a new class of strong authentication protocols that resist all the well-known passive and active attacks over the network. SRP borrows some elements from other key-exchange and identification protcols and adds some subtle modifications and refinements. The result is a protocol that preserves the strength and efficiency of the EKE family protocols while fixing some of their shortcomings.
The following is a description of SRP-6 and 6a, the latest versions of SRP:

  N    A large safe prime (N = 2q+1, where q is prime)
       All arithmetic is done modulo N.
  g    A generator modulo N
  k    Multiplier parameter (k = H(N, g) in SRP-6a, k = 3 for legacy SRP-6)
  s    User's salt
  I    Username
  p    Cleartext Password
  H()  One-way hash function
  ^    (Modular) Exponentiation
  u    Random scrambling parameter
  a,b  Secret ephemeral values
  A,B  Public ephemeral values
  x    Private key (derived from p and s)
  v    Password verifier

The host stores passwords using the following formula:

  x = H(s, p)               (s is chosen randomly)
  v = g^x                   (computes password verifier)

The host then keeps {I, s, v} in its password database. The authentication protocol itself goes as follows:

User -> Host:  I, A = g^a                  (identifies self, a = random number)
Host -> User:  s, B = kv + g^b             (sends salt, b = random number)

        Both:  u = H(A, B)

        User:  x = H(s, p)                 (user enters password)
        User:  S = (B - kg^x) ^ (a + ux)   (computes session key)
        User:  K = H(S)

        Host:  S = (Av^u) ^ b              (computes session key)
        Host:  K = H(S)

Now the two parties have a shared, strong session key K. To complete authentication, they need to prove to each other that their keys match. One possible way:

User -> Host:  M = H(H(N) xor H(g), H(I), s, A, B, K)
Host -> User:  H(A, M, K)

The two parties also employ the following safeguards:
The user will abort if he receives B == 0 (mod N) or u == 0.
The host will abort if it detects that A == 0 (mod N).
The user must show his proof of K first. If the server detects that the user's proof is incorrect, it must abort without showing its own proof of K.


http://srp.stanford.edu/design.html

COMMENTAIRE

Toute ressemblance avec Diffie–Hellman est purement fortuite ... ou pas!
« Modifié: 25 octobre 2014 à 23:33:55 par corrector »

Electrocut

  • Abonné Orange Fibre
  • *
  • Messages: 512
  • Pont-Péan (35)
Sécurité contre l'écoute lors de la connexion lafibre.info
« Réponse #26 le: 26 octobre 2014 à 19:39:18 »
Merci pour ta réponse
Plusieurs commentaires rapides :

- L'idée du poivre est d'être archi-protégé, il n'apparaît jamais en BDD (donc il n'est pas attaquable via SQL, ni via une sauvegarde de la BDD), il est dans un fichier spécial auquel seul le processus d'authentification accède, si n'importe quel client peut le récupérer ça n'apporte plus rien, autant le virer, le sel suffit bien.
Tout à fait.
Je note pour les conseils de mise en place ;)

Citer
- Comme fonction lente, bcrypt est vieux, scrypt est plus à la mode.
Je note :)

Citer
SRP Protocol Design.
...
Merci pour cette solution, qui permet à la fois :
  • De protéger la confidentialité du mot de passe, durant la phase d'authentification
  • Qu'une compromission de la BDD utilisateurs ne permette pas à un attaquant de s'identifier en tant qu'un utilisateur
En revanche, il faut avouer qu'on monte tout de suite d'un cran en terme de complexité algorithmique, de complexité des échanges (nombreux allers retours clients <-> serveurs), et de complexité de mise en œuvre.

A noter que je viens de tomber sur une question d'un utilisateur, dont la réflexion l'avait amené à se poser la même question que moi :
How can salted, hashed password storage be combined with a plaintext, nonce and hash based authentication?

Et la réponse qui lui a été proposée est ... Secure Remote Password protocol (SRP Protocol)
Voilà qui est rassurant, ça converge avec ta suggestion ;D

corrector

  • Invité
Sécurité contre l'écoute lors de la connexion lafibre.info
« Réponse #27 le: 26 octobre 2014 à 21:25:13 »
Merci pour cette solution, qui permet à la fois :
  • De protéger la confidentialité du mot de passe, durant la phase d'authentification
  • Qu'une compromission de la BDD utilisateurs ne permette pas à un attaquant de s'identifier en tant qu'un utilisateur
Oui, et aussi à l'utilisateur de vérifier l'identité d'un serveur TLS sans passer par un tiers de confiance, en initialisant la session avec la clé générée (TLS en mode PSK, sans certificat).

On peut aussi faire l'identification en TLS afin de protéger le nom d'utilisateur, en mode TLS classique avec certificat.

En revanche, il faut avouer qu'on monte tout de suite d'un cran en terme de complexité algorithmique, de complexité des échanges (nombreux allers retours clients <-> serveurs), et de complexité de mise en œuvre.
Oui, la sécurité est rarement gratuite : quand le coût n'est pas la difficulté pour l'utilisateur, c'est en complexité d'implèmentation.

corrector

  • Invité
Sécurité contre l'écoute lors de la connexion lafibre.info
« Réponse #28 le: 27 octobre 2014 à 00:11:35 »
Parlons de risques de sécurité en pratique : type d'attaques et impact.

Les attaques peuvent porter sur le serveur ou le réseau; on met de coté les attaques sur le logiciel client, bien qu'en pratique les maliciels sur le poste client soient parmi les menaces les plus sérieuses (on pourrait gagner en robustesse au niveau de l'architecture de l'OS du client, mais c'est un autre sujet).

Il faut distinguer les attaques purement passives, par exemple une sonde sur un routeur, ou bien l'écoute sur n'importe quel nœud d'un média à diffusion (p.ex. Wifi ouvert), et les attaques actives qui impliquent de modifier les données. Les attaques actives ne sont pas spécialement difficiles à pratiquer, mais elles ne sont pas furtives.

Les piratages de serveurs stockant des fichiers d'utilisateurs sont très courants.

Le piratage d'une copie de sauvegarde d'un serveur ne compromet que la confidentialité, mais le piratage d'un serveur live permet de modifier le programme afin qui conserve des données qu'il devrait effacer. Cependant la plupart des attaques sont one-shot : récupération des données et non modification durable du fonctionnement du serveur. (L'attaque par injection SQL est un grand classique qui ne permet évidemment pas de reprogrammer le serveur.)

Bien sûr, la possibilité de certaines attaques est inhérente au fonctionnement d'un réseau ouvert comme Internet, alors que d'autres sont liées à l'incompétence des programmeurs (p.ex. fabriquer une requête SQL par concaténation de chaines de caractères de diverses origines).

On parlera de robustesse d'un système quand une erreur de programmation n'a pas de conséquences catastrophique.

Concernant les mdp :

Les utilisateurs sont des humains et pas des machines (sinon chacun génère un mdp avec 80 bits d'entropie sur chaque service et ne l'oublie jamais, et tout ce qui suit n'existe pas), donc :

- les mdp ne sont pas des suites de lettres purement aléatoires et n'ont pas une entropie idéale, donc il faut freiner le plus possible les attaques de type dictionnaire, pour protéger les utilisateurs qui ont un mdp qui n'est pas password ou 1234 (qui sera cassable de toute façon) mais qui n'est pas non plus l8z0gU7-I_J0qafgr6'=NBk7BD_0eg

- les mdp sont souvent soient réutilisés tels quels sur plusieurs services, soient réutilisés avec des variations mineurs; il faut éviter les attaques croisées trop faciles.

corrector

  • Invité
Sécurité contre l'écoute lors de la connexion lafibre.info
« Réponse #29 le: 27 octobre 2014 à 00:30:04 »
L'objectif premier est donc selon moi de minimiser l'exposition du mdp (entré par l'utilisateur); ensuite, de protéger les secrets et autres jetons permettant à l'utilisateur de s'authentifier, qu'ils soient dérivés du mdp ou bien générés à chaque occasion, comme un témoin HTTP (HTTP cookie) de session (p.ex. "lafibreinfo" sur ce site).

En effet, le mdp donne une information sur l'utilisateur et son choix de mdp, et potentiellement à d'autres mdp, alors qu'un jeton ne donne accès qu'à un service.

Concernant un site Web, il est possible d'exécuter du code sur le client en JS, mais celui-ci sera fourni par le serveur à chaque connexion, donc la confiance dans le code dépend de la possibilité pour le client d'identifier et de faire confiance au serveur. (P.ex. sur lafibre il suffirait qu'un tiers de confiance soit compromis pour établir un faux certificat et pratiquer une attaquer MITM, et ajouter un script qui envoie le mdp en clair à un serveur.)

On pourrait imaginer une solution de type "client lourd" avec un plugin ou une app Google Chrome (qui n'a besoin d'aucun privilège) pour implèmenter une procédure coté client (avec possibilité de contrôler les MàJ auto et de les refuser).

corrector

  • Invité
Sécurité contre l'écoute lors de la connexion lafibre.info
« Réponse #30 le: 27 octobre 2014 à 01:55:28 »
Quelques définitions :

u = nom d'utilisateur
p = le mdp
sid = ID de session
h = fonction de hachage cryptographique (généralement très rapide)
hp  = fonction de traitement cryptographique lente (relativement lente, sur une archi donnée : à une époque DES était considéré comme "lent")

Le vérificateur est une donnée qui permet de tester si un mdp est correct.

p.ex. h(p), hp(salt,p) ou h(h(u,p),sid) sont des vérificateurs

La connaissance d'un vérificateur est donc suffisante pour effectuer une attaque par dictionnaire. (Le serveur doit stocker au moins les vérificateurs et pourrait tenter une attaque par dictionnaire.)

Un vérificateur trivial est le p, ou p chiffré avec une méthode symétrique dont le serveur a la clef. Ceci est intrinsèquement moins sûr évidemment.

Un authentifiant est une donnée suffisante pour s'authentifier comme un utilisateur. (Le mdp est trivialement un authentifiant.)

p.e. sur Simple Forum : SHA1(u || ":" || p) est un authentifiant

Cet authentifiant peut être considéré comme le mdp réel du système; le mdp de l'utilisateur n'étant que le mdp apparent. Cependant, la révélation d'un authentifiant n'est pas aussi grave que celle du mdp car elle ne révèle pas quel genre de mdp l'utilisateur a choisi.
« Modifié: 27 octobre 2014 à 02:18:42 par corrector »

corrector

  • Invité
Sécurité contre l'écoute lors de la connexion lafibre.info
« Réponse #31 le: 27 octobre 2014 à 02:18:17 »
J'ai lu que la bonne pratique, pour le stockage d'informations d'authentification utilisateur sur un serveur, était de stocker en base de donnée, pour chaque utilisateur les éléments suivants :
  • login
  • hash = bcrypt (pepper || password || salt)
  • salt
salt étant choisi aléatoirement, différent pour chaque utilisateur
pepper étant codé en dur quelque part (idéalement, offusqué).
L'idée du poivre est de protéger au maximum l'accès au vérificateurs : seul le serveur qui a accès au poivre par un mécanisme hyper sécurisé peut faire les calculs de vérification des mdp. Ainsi même un pirate ayant accès à la table (SQL ou simple fichier texte) des utilisateurs ne peut rien en faire, il ne peut même pas tenter d'attaque par dictionnaire hors ligne.

Une modification simple de cette méthode est d'avoir deux couches de hachage : une couche intérieure qui protège le mdp entré par l'utilisateur et une couche extérieure qui dépend du poivre, p.ex.:

v = h2(pepper, h1(salt, p))

corrector

  • Invité
Sécurité contre l'écoute lors de la connexion lafibre.info
« Réponse #32 le: 27 octobre 2014 à 02:35:57 »
Un nonce (nounce) est un nombre qui n'est généré qu'une seule fois, dans l'Histoire. C'est un grand nombre aléatoire tel que la probabilité de le générer plusieurs fois est négligeable.

On fait des calculs avec cette valeur; le résultat de calcul a forcèment été produit après que le nonce ait été émis, et est lié à ce nonce : le nonce agit comme un identifiant de session.

L'exemple typique est l'authentification HTTP Digest constituée de deux messages :

S->C : n
C->S : h(n, p)

Le nonce crée une courte session de 2 messages, mais avec l'authentification HTTP Digest la session s'arrête là et ne protège  ni la requête HTTP ni la réponse, puisqu'il n'y a aucune crypto en dehors des messages HTTP Digest. Un attaquant actif ne pourrait pas altérer ces deux échanges messages HTTP Digest mais il pourrait modifier tout le reste. Il faut donc que la session HTTP soit elle même protégée par TLS pour que l'authentification HTTP, la requête et la réponse soient reliés (TLS protège la session en utilisant un même jeu de clefs cryptographiques).

Dans les protocoles de mdp, le nonce est souvent appelé "challenge".

corrector

  • Invité
Sécurité contre l'écoute lors de la connexion lafibre.info
« Réponse #33 le: 27 octobre 2014 à 02:59:28 »
Les caractéristiques souhaitables d'un protocole de vérification de mdp sont donc :

(clear-pw) aucun mdp ne circule en clair
(pass-ver) l'écoute passive ne révèle pas un vérificateur de mdp
(mitm-ver) une attaque réseau active (MITM) ne révèle pas un vérificateur de mdp
(stor-pw) le serveur ne stocke pas les mdp en clair (ou équivalent clair)
(prot-pw) le serveur n'obtient pas le mdp en clair lors de l'exécution du protocole
(stor-auth) le serveur ne stocke pas un authentifiant
(prot-auth) le serveur n'obtient pas un authentifiant lors de l'exécution du protocole
(slow-verif) l'exécution du vérificateur est lente
(sec-session) le protocole crée une session sécurisée
(no-dos) le serveur ne peut pas être forcé faire des calculs ridiculement lourds (pour éviter le DoS)

La lenteur du vérificateur est importante pour résister le plus possible aux attaques hors ligne par dictionnaires et force brute contre les mdp relativement courts.

La session sécurisée empêche une attaque active une fois que l'authentification a eu lieu : les requêtes sont liées à l'authentification par mdp, si elles sont modifiées elles ne seront plus considérées comme authentifiées.
« Modifié: 27 octobre 2014 à 20:01:07 par corrector »

corrector

  • Invité
Sécurité contre l'écoute lors de la connexion lafibre.info
« Réponse #34 le: 27 octobre 2014 à 03:31:13 »
Parmi les protocoles utilisant un mdp, il y a notamment WPA (ou WPA2) en mode Personal (= PSK = clé pré-partagée).

On en a discuté récemment : https://lafibre.info/cryptographie/wifi-mode-de-securisation/

C'est un cas d'école de protocole où :
- chaque participant est authentifié, de façon symétrique;
- le mdp n'est jamais transmis;
- une session sécurisée est crée;
- protocole permettant l'attaque hors ligne par dictionnaire.

Un mdp peut être traité comme une clé pré-partagée, mais cela va généralement permettre ces attaques hors-ligne. Quand le mdp a une entropie faible, ce n'est pas un compromis souhaitable.

corrector

  • Invité
Sécurité contre l'écoute lors de la connexion lafibre.info
« Réponse #35 le: 27 octobre 2014 à 03:45:17 »
Merci pour ta réponseTout à fait.
Je note pour les conseils de mise en place ;)
Je note :)
Merci pour cette solution, qui permet à la fois :
  • De protéger la confidentialité du mot de passe, durant la phase d'authentification
  • Qu'une compromission de la BDD utilisateurs ne permette pas à un attaquant de s'identifier en tant qu'un utilisateur
En revanche, il faut avouer qu'on monte tout de suite d'un cran en terme de complexité algorithmique, de complexité des échanges (nombreux allers retours clients <-> serveurs), et de complexité de mise en œuvre.
En terme de subtilité, parce que la cryptographie est un domaine pas du tout évident plein de pièges, surtout la crypto asymétrique et le choix de nombres premiers.

En terme de temps de calculs aussi, parce qu'il y a des exponentielles avec de grands nombres à calculer dans des corps finis.

Ce qui signifie que le serveur doit faire des calculs importants pour toute demande d'authentification - enfin, pas plus importants que pour ouvrir une nouvelle session TLS. Mais quand même, il faut en tenir compte; c'est autre chose que de calculer un ou deux malheureux MD5 dans CHAP/APOP/DIGEST-MD5/CRAM-MD5/HTTP Digest.