Bcrypt

Si ce bandeau n'est plus pertinent, retirez-le. Cliquez ici pour en savoir plus.
Si ce bandeau n'est plus pertinent, retirez-le. Cliquez ici pour en savoir plus.

Cet article ne cite pas suffisamment ses sources ().

Si vous disposez d'ouvrages ou d'articles de référence ou si vous connaissez des sites web de qualité traitant du thème abordé ici, merci de compléter l'article en donnant les références utiles à sa vérifiabilité et en les liant à la section « Notes et références ».

En pratique : Quelles sources sont attendues ? Comment ajouter mes sources ?

Bcrypt
Présentation
Type
Créateur
Niels Provos (en)Voir et modifier les données sur Wikidata

modifier - modifier le code - modifier WikidataDocumentation du modèle

Bcrypt est une fonction de hachage créée par Niels Provos et David Mazières. Elle est basée sur l'algorithme de chiffrement Blowfish et a été présentée lors de USENIX en 1999[1]. En plus de l'utilisation d'un sel pour se protéger des attaques par table arc-en-ciel (rainbow table), bcrypt est une fonction adaptative, c'est-à-dire que l'on peut augmenter le nombre d'itérations pour la rendre plus lente. Ainsi elle continue à être résistante aux attaques par force brute malgré l'augmentation de la puissance de calcul.

Blowfish est un algorithme de chiffrement par bloc notable pour sa phase d'établissement de clef relativement coûteuse. Bcrypt utilise cette propriété et va plus loin. Provos et Mazières ont conçu un nouvel algorithme d'établissement des clefs nommé Eksblowfish (pour Expensive Key Schedule Blowfish). Dans cet algorithme, une première phase consiste à créer les sous-clefs grâce à la clef et au sel. Ensuite un certain nombre de tours de l'algorithme standard blowfish sont appliqués avec alternativement le sel et la clef. Chaque tour commence avec l'état des sous-clefs du tour précédent. Cela ne rend pas l'algorithme plus puissant que la version standard de blowfish, mais on peut choisir le nombre d'itérations ce qui le rend arbitrairement lent et contribue à dissuader les attaques par table arc-en-ciel et par force brute.

Bcrypt permet aussi de chiffrer des informations, bien que cette fonction soit moins utilisée en développement informatique. D'ailleurs le nom Bcrypt est souvent à l'origine de confusion chez les apprentis développeurs qui utilisent indifféremment les mots hachage et chiffrement. Ce sont deux notions qui n'ont rien à voir, la hachage est à sens unique, alors que le chiffrement peut être inversé avec le déchiffrement, grâce au système de clé publique-clé privée[2].

Le nombre d'itérations doit être une puissance de deux, c'est un paramètre de l'algorithme et ce nombre est codé dans le résultat final.

Après la première implémentation dans OpenBSD, cet algorithme s'est généralisé et est maintenant disponible dans un grand nombre de langages (C, C++, C#, Delphi, Elixir, Go, JavaScript, Java, Python, Ruby, Perl, PHP 5.3+etc.).

Algorithme

L'algorithme dépend fortement de l'établissement des clefs de la méthode « Eksblowfish » :

EksBlowfishSetup(cost, salt, key)
    state 
  
    
      
        
      
    
    {\displaystyle \gets }
  
 InitState()
    state 
  
    
      
        
      
    
    {\displaystyle \gets }
  
 ExpandKey(state, salt, key)
    repeat (2cost)
        state 
  
    
      
        
      
    
    {\displaystyle \gets }
  
 ExpandKey(state, 0, key)
        state 
  
    
      
        
      
    
    {\displaystyle \gets }
  
 ExpandKey(state, 0, salt)
    return state

Cette méthode prend trois paramètres :

  • cost : le coût souhaité de l'algorithme. C'est le logarithme binaire du nombre d'itérations choisi ;
  • salt : sel utilisé par l'algorithme ;
  • key : le mot de passe que l'on souhaite hacher.

InitState fonctionne de la même manière que dans l'algorithme Blowfish original, le P-array et le S-bow sont initialisés avec la partie décimale de π {\displaystyle \pi } en hexadécimal.

La fonction ExpandKey peut se décrire ainsi :

ExpandKey(state, salt, key)
    for(n = 1..18)
        Pn 
  
    
      
        
      
    
    {\displaystyle \gets }
  
 key[32(n-1)..32n-1] 
  
    
      
        
      
    
    {\displaystyle \oplus }
  
 Pn //treat the key as cyclic
    ctext 
  
    
      
        
      
    
    {\displaystyle \gets }
  
 Encrypt(salt[0..63])
    P1 
  
    
      
        
      
    
    {\displaystyle \gets }
  
 ctext[0..31]
    P2 
  
    
      
        
      
    
    {\displaystyle \gets }
  
 ctext[32..63]
    for(n = 2..9)
        ctext 
  
    
      
        
      
    
    {\displaystyle \gets }
  
 Encrypt(ctext 
  
    
      
        
      
    
    {\displaystyle \oplus }
  
 salt[64(n-1)..64n-1]) // Encrypt utilise la clef actuelle et le sel sous forme cyclique
        P2n-1) 
  
    
      
        
      
    
    {\displaystyle \gets }
  
 ctext[0..31]
        P2n 
  
    
      
        
      
    
    {\displaystyle \gets }
  
 ctext[32..63]
    for(i = 1..4)
        for(n = 0..127)
            ctext 
  
    
      
        
      
    
    {\displaystyle \gets }
  
 Encrypt(ctext 
  
    
      
        
      
    
    {\displaystyle \oplus }
  
 salt[64(n-1)..64n-1]) // comme au-dessus
            Si[2n] 
  
    
      
        
      
    
    {\displaystyle \gets }
  
 ctext[0..31]
            Si[2n+1] 
  
    
      
        
      
    
    {\displaystyle \gets }
  
 ctext[32..63]
    return state

Notes et références

  1. Niels Provos et Mazières, David, « A Future-Adaptable Password Scheme », Proceedings of 1999 USENIX Annual Technical Conference,‎ , p. 81–92 (lire en ligne)
  2. Stephane, « Différence entre le cryptage et le hachage - Les Idées Clis », sur IdeeClis, (consulté le )

Annexes

Liens externes

  • Implémentation d'OpenBSD en C
  • Calculatrice bcrypt en ligne
  • Implementation en C d'Openwall
  • JFBCrypt - implementation de bcrypt en Objective C
  • BCrypt.Net Implémentation en C# pour .NET
  • jBCrypt - Implémentation de bcrypt en Java par Damien Miller
  • bcrypt.go - implementation en Go
  • node.bcrypt.js - API bcrypt pour node.js autour de la version C OpenBSD
  • twin-bcrypt - Implémentation en javascript+asm.js pour Node.js et navigateurs basée sur jBCrypt
  • dBCrypt - Implémentation en Dart basée sur jBCrypt
  • bcrypt-ruby - Implémentation en Ruby
  • Crypt::Eksblowfish::Bcrypt Implementation en Perl
  • bcrypt hash générateur et vérificateur outil en ligne/
  • bcrypt - Implémentation pour le langage Python
  • icône décorative Portail de la cryptologie