Bcrypt
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.
Type | |
---|---|
Créateur |
Niels Provos (en) |
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.
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 InitState() state ExpandKey(state, salt, key) repeat (2cost) state ExpandKey(state, 0, key) state 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 en hexadĂ©cimal.
La fonction ExpandKey
peut se décrire ainsi :
ExpandKey(state, salt, key) for(n = 1..18) Pn key[32(n-1)..32n-1] Pn //treat the key as cyclic ctext Encrypt(salt[0..63]) P1 ctext[0..31] P2 ctext[32..63] for(n = 2..9) ctext Encrypt(ctext salt[64(n-1)..64n-1]) // Encrypt utilise la clef actuelle et le sel sous forme cyclique P2n-1) ctext[0..31] P2n ctext[32..63] for(i = 1..4) for(n = 0..127) ctext Encrypt(ctext salt[64(n-1)..64n-1]) // comme au-dessus Si[2n] ctext[0..31] Si[2n+1] ctext[32..63] return state
Notes et références
- Niels Provos et MaziĂšres, David, « A Future-Adaptable Password Scheme », Proceedings of 1999 USENIX Annual Technical Conference,â , p. 81â92 (lire en ligne)
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