web-dev-qa-db-fra.com

Bcrypt est-il meilleur que scrypt

Duplicata possible:
Des experts en sécurité recommandent-ils bcrypt pour le stockage des mots de passe?

Je ne suis pas un expert en sécurité et je ne prétends pas que c'est la raison pour laquelle je pose la question ici. J'écris de nombreuses applications basées sur PHP et jusqu'à présent, j'utilisais bcrypt pour hacher mes mots de passe.

Le site Web scrypt prétend être 4000 fois plus lent que bcrypt, cette affirmation peut-elle vraiment être correcte? Dans l'affirmative, serait-il "préférable" pour un développeur soucieux de la sécurité de passer à l'utilisation de scrypt au lieu de bcrypt?

52
twigg

Scrypt est censé être "meilleur" que bcrypt, mais il est également beaucoup plus récent, et c'est mauvais (parce que "plus récent" implique intrinsèquement "a reçu moins d'attention").

Tous ces schémas de hachage de mot de passe tentent de rendre le traitement d'un seul mot de passe plus cher pour l'attaquant, sans le rendre trop cher pour votre serveur. Étant donné que votre serveur est, fondamentalement, un PC et que l'attaquant peut choisir le matériel le plus efficace pour sa tâche, les schémas de hachage de mot de passe essaient d'être tels que la meilleure plate-forme pour eux sera un PC. PBKDF2 peut être complètement optimisé avec le GPU, tandis que bcrypt et scrypt sont beaucoup moins compatibles avec le GPU. Bcrypt et scrypt nécessitent tous deux RAM rapide , qui est une ressource rare dans un GPU (un GPU peut avoir beaucoup de RAM, mais ne pourra pas y accéder à partir de tous les cœurs simultanément).

Il se trouve que les modernes FPGA incorporent de nombreux petits blocs RAM qui sont très pratiques pour optimiser une attaque de dictionnaire parallèle avec bcrypt: cela signifie qu'un attaquant obtiendra un énorme coup de pouce en utilisant 1000 $ de FPGA au lieu de 1000 $ de PC générique. C'est le genre de coup de pouce que nous voulons éviter. D'où scrypt, qui nécessite beaucoup plus de RAM; pas trop beaucoup pour un PC (nous ne parlons que de quelques mégaoctets ici), mais assez pour rendre la vie difficile à un FPGA (voir cette réponse pour un traitement détaillé de la question).

Ainsi, théoriquement , scrypt devrait être meilleur que bcrypt. Cependant , tout cela dépend du fait que scrypt soit à la hauteur de ses promesses cryptographiques. Ce type de garantie de robustesse ne peut être atteint que dans le temps: le système sera réputé sûr s'il survit à des années d'agressions incessantes de cryptographes. Le temps nécessaire est bien sûr un peu subjectif et dépend aussi beaucoup de exposition (plus un schéma est largement déployé, plus il devient "intéressant" un objectif, en ce sens le briser augmenterait la renommée académique de l'agresseur, attirant ainsi plus de contrôle). Ma propre règle d'or est d'attendre environ 5 ans après la publication, donc 2014 dans le cas de scrypt.

Il y a aussi la question de la disponibilité : si vous voulez utiliser une fonction, alors vous avez besoin d'une implémentation qui peut être insérée dans le framework de programmation que vous utilisez.

54
Thomas Pornin

Je prendrais l'affirmation "Scrypt est 4000 fois plus lent que BCrypt" avec un grain de sel. Premièrement, ces deux algorithmes sont de complexité variable; même si ce chiffre "4000x" est valable, vous pouvez rendre BCrypt tout aussi lent en ajoutant 11 tours supplémentaires à la dérivation de clé. Deuxièmement, à un moment donné, SCrypt et BCrypt sont limités par le temps qu'il faut pour calculer légitimement un hachage sur l'ordinateur de l'utilisateur moyen (ou sur votre serveur si vous le faites côté serveur pour une application Web). SCrypt étant 4000x plus lent pourrait bien augmenter le taux de rebond de votre site Web de plus que la sécurité accrue.

Raisons de choisir BCrypt:

  • Comme SCrypt, BCrypt est configurablement lent, donc il suivra très bien la loi de Moore lorsqu'il affrontera un crackbot CPU/GPU traditionnel.
  • BCrypt est âgé de 14 ans, basé sur un chiffre de plus de 20 ans, et aucun des deux n'a démontré sa faiblesse théorique réalisable (il existe une vulnérabilité connue en texte brut dans Blowfish qui n'affecte en rien BCrypt du tout, mais il y a un bogue dans une implémentation UNIX de BCrypt pourrait entraîner des échecs d'application s'il était alimenté par certains codes de caractères).

    SCrypt n'a que 3-4 ans, il n'a donc pas le pedigree cryptanalytique requis pour gagner la confiance de la plupart des cryptographes. Cela ne signifie pas qu'il est vulnérable; cela signifie que les experts en sécurité des vadrouilles ne sont pas suffisamment convaincus qu'ils ne sont pas vulnérables pour l'instant.

  • Il existe des implémentations de BCrypt disponibles pour pratiquement chaque langue/runtime. Encore une fois, SCrypt, étant si nouveau, n'est pas aussi largement accepté et le nombre d'implémentations bien contrôlées est donc plus limité.

Il n'y a vraiment qu'une seule raison de choisir SCrypt plutôt que BCrypt et c'est la raison pour laquelle SCrypt a été conçu: la principale faiblesse de BCrypt contre un système de craquage distribué est sa faible utilisation constante de la mémoire. Cela rend BCrypt vulnérable au forçage brutal rentable utilisant des tableaux de portes programmables sur le terrain ou FPGA relativement peu coûteux. Ces baies ont une quantité relativement faible de SRAM intégrée à leurs blocs logiques, ce qui est encore suffisant pour contenir les données d'état de BCrypt. Comme Thomas l'a dit, ces baies sont moins chères à acheter et à configurer qu'un réseau distribué de crackbots traditionnels basés sur CPU ou GPU, de manière équivalente, votre attaquant en a plus pour son argent.

SCrypt, en revanche, utilise non seulement le temps exponentiel, mais la mémoire exponentielle; à mesure que le nombre de tours de dérivation augmente, SCrypt nécessite le stockage d'une série de "clichés" de données d'état intermédiaires, qui sont utilisés dans d'autres opérations de dérivation. Cela ne pose aucun problème à l'ordinateur d'un utilisateur légitime générant un hachage (vous utilisez probablement quelques Mo au plus), mais la mémoire limitée d'un bloc FPGA devient rapidement insuffisante. Maintenant, tout ce que vous pouvez stocker, vous pouvez plutôt calculer "à la demande", mais parce que chacun de ces états intermédiaires est le résultat de sa propre série d'opérations exponentiellement complexes (dont chacune est moins complexe que le hachage final, mais doit être calculé plus de fois pour une utilisation à la demande), l'attaquant est maintenant sur les cornes d'un dilemme; soit ils ont besoin de plus de FPGA de manière exponentielle pour suivre le temps de calcul accru du modèle à la demande, soit ils doivent mettre à niveau les FPGA vers quelque chose avec suffisamment de mémoire pour faire le travail (en gros, vous envisagez un processeur/FSB simple à haute horloge/Architectures RAM à ce stade, ce qui est à l'origine des clusters distribués de plusieurs millions de dollars de pétaflop). Quoi qu'il en soit, les FPGA ne sont plus aussi réalisables qu'ils le sont pour BCrypt (ou PBKDF2).

26
KeithS

Avec scrypt, en plus d'augmenter le calcul, vous pouvez augmenter la quantité de mémoire nécessaire pour calculer le hachage. Cela ne dérange pas beaucoup les implémentations logicielles mais est beaucoup plus difficile à implémenter avec du matériel - c'est ce qu'un attaquant dédié est susceptible de développer et d'utiliser. bcrypt (et PBKDF2) utilise des quantités de mémoire constantes et faibles.

- Orip

Par https://stackoverflow.com/questions/1226513/whats-the-advantage-of-scrypt-over-bcrypt

10
Lucas Kauffman