« Bcrypt » : différence entre les versions

De Wiki du LAMA (UMR 5127)
Aller à la navigation Aller à la recherche
Ligne 108 : Ligne 108 :
== Les particularités de Bcrypt ==
== Les particularités de Bcrypt ==
Pourquoi utiliser Bcrypt par rapport à d'autres fonctions de hachage ?
Pourquoi utiliser Bcrypt par rapport à d'autres fonctions de hachage ?
L'intérêt par rapport à d'autre fonction de hachage comme md5 ou sha1 est quel l’algorithme utilisé est lent ce qui rend les attaques par brute force ou avec une table arc-en-ciel inutilisable pour un attaquant.


Bcrypt est une fonction adaptative dans le sens où on peut préciser le nombre d'itérations. Plus le nombre d'itérations est important, plus
Bcrypt est une fonction adaptative dans le sens où on peut préciser le nombre d'itérations. Plus le nombre d'itérations est important, plus le hachage est long.


=Sources=
=Sources=

Version du 5 novembre 2018 à 15:00

Auteurs : Antoine Petetin et Florian Sebire

Introduction

Le nombre de pirates ne cesse d'augmenter ces dernières années, et les sites doivent renforcer leurs sécurités.

Quelques définitions

Fonction de hachage
Une fonction de hachage transforme une donnée en entrée de taille quelconque en une donnée de sortie de taille fixe. Une fonction de hachage cryptographique va permettre de lier un clair à son empreinte. Pour que cette fonction soit efficace, il ne faudrait pas (en théorie) pouvoir retrouver le clair à partir du haché. Pour cela, cette fonction doit être aussi injective que possible.
Empreinte
Une empreinte est le résultat d'une fonction de hachage sur un clair. Une empreinte est aussi appelée une hash value, un hash code, un digest ou encore un hash.

Processus d'authentification sur un site web

L'identification d'un utilisateur sur un site est assez classique. La plupart du temps, les mots de passe ne sont pas stockés en clair dans la base de donnée du site. On stocke le haché d'un mot de passe clair. Ainsi, un hacker qui arriverait à accéder à la base de données ne verrait que les empreintes du clair, et ne pourrait pas en déduire le clair à partir de ce dernier (si le chiffrement respecte le secret parfait).

Le procédé est le suivant :

  1. L'utilisateur saisit son identifiant et son mot de passe (le clair).
  2. Ce mot de passe est envoyé au serveur qui va hacher le mot de passe grâce à une fonction de hachage.
  3. Le serveur va ensuite ensuite comparer le haché du mot de passe donné et le haché stocké dans la base de données du site.
  4. Si les 2 hachés correspondent alors, l’utilisateur est authentifié.

Attaques possibles

Il existe des attaques pour retrouver le mot de passe en clair à partir du haché. On utiliser le fait que la fonction de hachage soit injective.

L'attaque brute force

Il s'agit de l'attaque la plus simple, mais aussi la plus longue. On va essayer de trouver le bon haché en testant l'ensemble des clairs possibles pour un alphabet donné. Généralement, les hackers utilisent des fichiers textes appelés dictionnaire, qui contient cet ensemble.

Fonction BrutForce(dictionnaire : Liste de string, hache: string) : string
Début
    var i = 0;
    Tant que i < dictionnaire.taille
    Faire
        Si h(dictionnaire.get(i)) == hache
            Retourner dictionnaire.get(i);
    i = i + 1;
    Fin Tant que
Retourner "";
Fin

L'attaque avec une table arc-en-ciel

L'attaque par collisions

L'attaque par collisions utilise, comme les attaques présentées précédemment, le fait que la fonction de hachage n'est pas tout à fait injective.

Le principe est de trouver plusieurs clairs qui donneraient un même haché. A partir de ces résultats, le hacker en déduit des règles sur la fonction de hachage.

Cette attaque se découpe en 2 variantes :

  • L'attaque classique

On essaye au hasard 2 clairs distincts dans notre ensemble de clairs qui donnent le même haché.

  • L'attaque avec préfixes choisis

Dans cette variante, on ne fait plus une comparaison avec des mots complets. On prend deux préfixes A et B disincts, et on cherche deux suffixes C et D pour lesquels où "." est la concaténation. Ainsi, les couples nous donnent plus d'indices sur la fonction de hachage comparé à une comparaison de deux clairs simples.

Complexifier le déchiffrement avec le salage

Le problème des fonctions de hachage usuelles est qu'elles sont injectives (ou presque). Le principe du salage est d'ajouter une information supplémentaire au chiffrement. On va concaténer le clair avec une chaine de caractères avant de chiffrer. Cette chaine est soit statique (pas très efficace), ou bien aléatoire.

Le salage aléatoire réduit l'efficacité de l'attaque par dictionnaire (surtout si le dictionnaire ne contient qu'un ensemble restreint de mots, comme les mots de la langue française par exemple). Elle ralentit l'attaque avec une table arc-en-ciel.

La condition de l'efficacité du salage est que le sel ne doit pas être connu de l'attaquant.

Bcrypt

Qu'est-ce que Bcrypt ?

Bcrypt est une fonction de hachage, créé par Niels Provos et David Mazières, et basée sur l'algorithme de chiffrement symétrique Blowfish : b pour Blowfish et crypt pour le nom de la fonction de hachage utilisé par le système de mot de passe UNIX.


Elle est utilisé dans certaines distribution Linux. Cette fonction est implémentée dans différents langage pour les développeurs comme PHP, C, C++, C#, Java ...

Les étapes du chiffrement

1. Génération des sous-clés avec la fonction eksblowfish (pour Expensive Key Schedule Blowfish)

Cette fonction prend 3 paramètres :

  • cost Le coût souhaité de l'algorithme (Nombre entre 4 et 31)
  • salt Le sel qui correspond à une chaîne de caractère (Tableau de 16 octets)
  • key le mot de passe que l'on souhaite hacher (Chaîne de caractère sur 1 à 72 octets)
EksBlowfishSetup(cost, salt, key)
    state  InitState()
    state  ExpandKey(state, salt, key)
    repeat (2cost)
        state  ExpandKey(state, 0, key)
        state  ExpandKey(state, 0, salt)
    return state


2. Chiffrement avec une partie des sous-clés

bcrypt(cost, salt, key)
   state  EksBlowfishSetup(cost, salt, key)  
   //Encrypt le texte "OrpheanBeholderScryDoubt" 64 fois
   ctext  "OrpheanBeholderScryDoubt"  //24 octets ==> trois bloc de 64 bit
   repeat (64)
      ctext  EncryptECB(state, ctext) //encrypt qui utilise l'agolrithme Blowfish en mode ECB

   //ctext sur 24 octets comme résulat du hash
   return Concatenate(cost, salt, ctext)

Après avoir généré le state des sous-clés, on prend la chaîne de caractère magique OrpheanBeholderScryDoubt sur 192 bits qu'on va encrypter 64 fois en utilisant eksblowfish en EBC Mode avec le state de la phase précédente.

Le résultat est ensuite préfixé par $2a$, $2y$, ou $2b$ suivant la version de bcrypt utilisé.

Les particularités de Bcrypt

Pourquoi utiliser Bcrypt par rapport à d'autres fonctions de hachage ? L'intérêt par rapport à d'autre fonction de hachage comme md5 ou sha1 est quel l’algorithme utilisé est lent ce qui rend les attaques par brute force ou avec une table arc-en-ciel inutilisable pour un attaquant.

Bcrypt est une fonction adaptative dans le sens où on peut préciser le nombre d'itérations. Plus le nombre d'itérations est important, plus le hachage est long.

Sources

https://en.wikipedia.org/wiki/Bcrypt

https://medium.com/@danboterhoven/why-you-should-use-bcrypt-to-hash-passwords-af330100b861

https://en.wikipedia.org/wiki/Hash_function

https://fr.wikipedia.org/wiki/Attaque_de_collisions

https://en.wikipedia.org/wiki/Blowfish_(cipher)

https://fr.wikipedia.org/wiki/Salage_(cryptographie)

https://auth0.com/blog/hashing-in-action-understanding-bcrypt/https://auth0.com/blog/hashing-in-action-understanding-bcrypt/