226 votes

SHA512 vs. Blowfish et Bcrypt

Je cherche des algorithmes de hachage, mais je n'ai pas trouvé de réponse.

  • Bcrypt utilise Blowfish
  • Blowfish est meilleur que MD5
  • Q : mais Blowfish est-il meilleur que SHA512 ?

Merci..

Mise à jour :

Je tiens à préciser que je comprends la différence entre le hachage et le cryptage. Ce qui m'a poussé à poser la question de cette façon est que cet article , où l'auteur se réfère à bcrypt comme à un "hachage adaptatif".

Comme bcrypt est basé sur Blowfish, j'ai été amené à penser que Blowfish est un algorithme de hachage. Si c'est un cryptage comme les réponses l'ont souligné, alors il me semble qu'il ne devrait pas avoir sa place dans cet article. Le pire est qu'il conclut que bcrypt est le meilleur. Ce qui me trouble aussi maintenant, c'est que la classe phpass (utilisée pour le hachage de mot de passe, je crois) utilise bcrypt (c'est-à-dire blowfish, c'est-à-dire le cryptage). D'après les nouvelles informations que vous me donnez (blowfish est un cryptage), cette classe semble incorrecte. Est-ce que quelque chose m'échappe ?

2 votes

Ce n'est pas faux ; voir les mises à jour de ma réponse pour une explication du fonctionnement de bcrypt et pourquoi il sert le même objectif qu'un algorithme à sens unique basé sur le hachage.

3 votes

bcrypt a simplement un "facteur de travail" plus élevé par défaut. SHA est supposé ne pas le faire... à moins que vous n'utilisiez passhash9, qui peut utiliser l'un ou l'autre avec un facteur de travail. pourquoi cette question est-elle fermée ? elle est loin d'être résolue et pourtant très importante.

1 votes

Le lien en question est down...............

326voto

erickson Points 127945

Il devrait suffire de dire si bcrypt ou SHA-512 (dans le contexte d'un algorithme approprié comme PBKDF2) est suffisant . Et la réponse est oui, l'un ou l'autre des algorithmes est suffisamment sûr pour qu'une violation se produise par un défaut de mise en œuvre, et non par cryptanalyse.

Si vous tenez à savoir lequel est le "meilleur", SHA-512 a fait l'objet d'examens approfondis par le NIST et d'autres organismes. Il est bon, mais des failles ont été reconnues qui, bien qu'elles ne soient pas exploitables actuellement, ont conduit à la concurrence de SHA-3 pour les nouveaux algorithmes de hachage. Il faut également garder à l'esprit que l'étude des algorithmes de hachage est plus récente que celle des algorithmes de chiffrement et que les cryptographes sont encore en train de les découvrir.

Même si bcrypt dans son ensemble n'a pas fait l'objet d'autant d'examens que Blowfish lui-même, je pense que le fait d'être basé sur un chiffre dont la structure est bien comprise lui confère une sécurité inhérente qui fait défaut à l'authentification par hachage. De plus, il est plus facile d'utiliser des GPU courants pour attaquer les hachages basés sur SHA-2 ; en raison de ses besoins en mémoire, l'optimisation de bcrypt nécessite du matériel plus spécialisé, comme des FPGA avec de la RAM intégrée.


Remarque : bcrypt est un algorithme qui utilise Blowfish en interne. Il ne s'agit pas d'un algorithme de chiffrement en soi. Il est utilisé pour obscurcir de manière irréversible les mots de passe, tout comme les fonctions de hachage sont utilisées pour faire un "hachage à sens unique".

Les algorithmes de hachage cryptographique sont conçus pour être impossibles à inverser. En d'autres termes, étant donné uniquement la sortie d'une fonction de hachage, il devrait être impossible de trouver un message qui produise la même sortie de hachage. En fait, il devrait être infaisable sur le plan informatique de trouver deux messages qui produisent la même valeur de hachage. Contrairement à un chiffrement, les fonctions de hachage ne sont pas paramétrées par une clé ; la même entrée produira toujours la même sortie.

Si une personne fournit un mot de passe qui correspond à la valeur stockée dans la table des mots de passe, elle est authentifiée. En particulier, en raison de l'irréversibilité de la fonction de hachage, on suppose que l'utilisateur n'est pas un attaquant qui a mis la main sur le hachage et l'a inversé pour trouver un mot de passe fonctionnel.

Considérons maintenant bcrypt. Il utilise Blowfish pour chiffrer une chaîne magique, en utilisant une clé "dérivée" du mot de passe. Plus tard, lorsqu'un utilisateur saisit un mot de passe, la clé est à nouveau dérivée, et si le texte chiffré produit par le chiffrement avec cette clé correspond au texte chiffré stocké, l'utilisateur est authentifié. Le texte chiffré est stocké dans la table "password", mais la clé dérivée n'est jamais stockée.

Pour casser la cryptographie ici, un attaquant devrait récupérer la clé à partir du texte chiffré. C'est ce qu'on appelle une attaque par "texte chiffré connu", puisque l'attaquant connaît la chaîne magique qui a été chiffrée, mais pas la clé utilisée. Blowfish a fait l'objet d'études approfondies et aucune attaque n'est encore connue qui permettrait à un attaquant de trouver la clé avec un seul texte en clair connu.

Ainsi, tout comme les digests cryptographiques basés sur des algorithmes irréversibles, bcrypt produit un résultat irréversible, à partir d'un mot de passe, d'un sel et d'un facteur de coût. Sa force réside dans la résistance de Blowfish aux attaques en texte en clair connues, ce qui est analogue à une "attaque de première préimage" sur un algorithme de condensé. Puisqu'il peut être utilisé à la place d'un algorithme de hachage pour protéger les mots de passe, bcrypt est confusément désigné comme un algorithme de "hachage" lui-même.

En supposant que les tables arc-en-ciel aient été déjouées par une utilisation appropriée du sel, toute fonction réellement irréversible réduit l'attaquant à l'essai et à l'erreur. Et la vitesse à laquelle l'attaquant peut faire des essais est déterminée par la vitesse de cet algorithme de "hachage" irréversible. Si une seule itération d'une fonction de hachage est utilisée, un attaquant peut faire des millions d'essais par seconde en utilisant un équipement qui coûte de l'ordre de 1000 $, testant tous les mots de passe jusqu'à 8 caractères en quelques mois.

Cependant, si la sortie du condensé est "réinjectée" des milliers de fois, il faudra des centaines d'années pour tester le même ensemble de mots de passe sur ce matériel. Bcrypt réalise le même effet de "renforcement de la clé" en itérant à l'intérieur de sa routine de dérivation de la clé, et une méthode appropriée basée sur le hachage comme PBKDF2 fait la même chose ; à cet égard, les deux méthodes sont similaires.

Ainsi, ma recommandation de bcrypt repose sur les hypothèses suivantes : 1) un Blowfish a fait l'objet d'un niveau d'examen similaire à celui de la famille de fonctions de hachage SHA-2, et 2) les méthodes de cryptanalyse pour les chiffres sont mieux développées que celles pour les fonctions de hachage.

0 votes

Merci pour la réponse et le commentaire. Je demandais en effet les raisons de la cryptanalyse/les tables d'arc-en-ciel, etc. Mais aussi j'avais l'impression que Blowfish était un hachage et non un cryptage comme il est utilisé dans la classe phpass (une classe utilisée pour le hachage de mot de passe je crois). J'ai mis à jour mon message original en conséquence.

4 votes

+1 grand poste. Mais j'ai deux questions. Blowfish a été remplacé par twofish il y a plus de dix ans, un système ne devrait-il pas utiliser des primitives modernes ? De plus, des milliers d'itérations semblent être un gaspillage dans des systèmes tels que les applications web où de nombreuses personnes se connectent à tout moment. Par exemple, PBKDF2 n'est implémenté que dans des scénarios où une seule personne se connecte à la fois, comme une fonction string2key pour un système de fichiers crypté. J'utilise l'adage "Si c'est trop lourd à soulever pour l'attaquant, alors c'est trop lourd pour votre serveur". Qu'en pensez-vous ?

17 votes

Je ne pense pas qu'il y ait quelque chose de mal à utiliser un primitif plus moderne. Les vulnérabilités sont souvent découvertes avec le temps, et Twofish a été développé en utilisant les connaissances acquises avec Blowfish. Cependant, je n'ai pas connaissance de vulnérabilités spécifiques qui invalideraient l'utilisation de Blowfish, donc un argument du type "si ça ne casse pas" pourrait également être avancé. Votre adage sur les attaquants ne me semble pas bon. Même si vous choisissez un algorithme qui demanderait des années à un attaquant pour tester un milliard de mots de passe, il ne consommera qu'une fraction de temps négligeable dans une application légitime.

50voto

caf Points 114951

Je suis d'accord avec la réponse d'erickson, avec une réserve : pour l'authentification des mots de passe, bcrypt est loin mieux qu'un une seule itération de SHA-512 - simplement parce qu'il est beaucoup plus lent. Si vous ne comprenez pas pourquoi la lenteur est un avantage dans ce jeu particulier, relisez l'article dont vous avez donné le lien (faites défiler jusqu'à " La rapidité est exactement ce que vous ne voulez pas dans une fonction de hachage de mot de passe. ").

Vous pouvez bien sûr construire un algorithme de hachage de mot de passe sécurisé autour de SHA-512 en l'itérant des milliers de fois, tout comme le fonctionnement de l'algorithme MD5 de PHK. Ulrich Drepper a fait exactement cela pour la fonction crypt() de la glibc. Il n'y a pas de raison particulière de le faire, cependant, si vous avez déjà une implémentation testée de bcrypt disponible.

3 votes

J'espère que ma réponse montre clairement qu'une seule itération de hachage n'est pas suffisante (malheureusement, même ce niveau de connaissance rudimentaire ne peut être assumé). "Si une seule itération d'une fonction de hachage est utilisée, un attaquant peut effectuer des millions d'essais par seconde à l'aide d'un équipement dont le coût est de l'ordre de 1000 $, testant tous les mots de passe jusqu'à 8 caractères en quelques mois. En revanche, si la sortie du condensé est "réinjectée" des milliers de fois, il faudra des centaines d'années pour tester le même ensemble de mots de passe sur ce matériel. Bcrypt obtient le même effet de "renforcement des clés" en itérant "

0 votes

@erickson : Oui, bien que je pense que vous avez peut-être enterré la piste là. Ce que j'essayais de dire, c'est qu'une comparaison directe entre bcrypt et SHA-512 n'est pas vraiment pertinente, car l'un est une fonction de dérivation de clé et l'autre n'est qu'une primitive cryptographique, inadaptée en soi.

4 votes

32voto

Glen Points 13521

Blowfish n'est pas un algorithme de hachage. C'est un algorithme de cryptage. Cela signifie que vous pouvez crypter quelque chose à l'aide de Blowfish, puis le décrypter plus tard en texte clair.

SHA512 est un algorithme de hachage. Cela signifie que (en théorie) une fois que vous avez haché l'entrée, vous ne pouvez plus récupérer l'entrée originale.

Ce sont deux choses différentes, conçues pour être utilisées pour des tâches différentes. Il n'y a pas de réponse "correcte" à "blowfish est-il meilleur que SHA512 ?" Vous pourriez aussi bien demander "les pommes sont-elles meilleures que les kangourous ?"

Si vous voulez en savoir plus sur le sujet, voici quelques liens :

19 votes

Je pense que la question porte sur l'utilisation de bcrypt comme protection irréversible des mots de passe, tout comme le hachage est utilisé à cette fin.

3 votes

@erickson le texte "Q : mais Blowfish est-il meilleur que SHA512 ?" me semble assez clair et montre que l'OP ne comprend pas les différences entre les 2 algorithmes.

1 votes

OP ici. En fait, d'après la réponse de Glen, blowfish est un algorithme de cryptage (qui est différent du hachage, si j'ai bien compris), je réalise maintenant que ma question était confuse. Ce qui est confus maintenant c'est que la classe phpass (utilisée pour le hachage de mot de passe je crois) utilise bcrypt (c'est à dire blowfish, c'est à dire le cryptage). Si blowfish est un cryptage, comment se fait-il que phpass l'utilise pour hacher les mots de passe, cela me semble être une faille, non ? Est-ce que quelque chose m'échappe ?

4voto

blowdart Points 28735

Blowfish n'est pas meilleur que MD5 ou SHA512, car ils servent des objectifs différents. MD5 et SHA512 sont des algorithmes de hachage, Blowfish est un algorithme de cryptage. Deux fonctions cryptographiques entièrement différentes.

2voto

disappearedng Points 1773

Je viens de tomber sur ça :

http://codahale.com/how-to-safely-store-a-password/

L'auteur de cet article peut-il se tromper ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X