SHA512 contre Blowfish et Bcrypt [fermé]

222

J'examine les 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..

Mettre à jour:

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

Puisque bcrypt est basé sur Blowfish, j'ai été amené à penser que Blowfish est un algorithme de hachage. Si c'est le cryptage comme l'ont indiqué les réponses, il me semble qu'il ne devrait pas avoir sa place dans cet article. Le pire, c'est qu'il conclut que bcrypt est le meilleur. Ce qui me déroute 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). Sur la base de ces nouvelles informations que vous me dites (Blowfish est le cryptage), cette classe sonne mal. Suis-je en train de manquer quelque chose?

Chris
la source
2
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 but qu'un algorithme "unidirectionnel" basé sur le hachage.
erickson
3
bcrypta simplement un "facteur de travail" plus élevé par défaut. SHA est supposé ne pas ... sauf si vous utilisez passhash9, qui peut utiliser l'un ou l'autre avec un facteur de travail. pourquoi cette question est-elle close? c'est loin d'être répondu mais très important.
1
Le lien en question est en panne ...............
Pacerier

Réponses:

320

Il devrait suffire de dire si bcrypt ou SHA-512 (dans le contexte d'un algorithme approprié comme PBKDF2) est assez bon . Et la réponse est oui, l'un ou l'autre algorithme est suffisamment sécurisé pour qu'une brèche se produise à travers une faille d'implémentation, pas une cryptanalyse.

Si vous insistez pour savoir ce qui est "meilleur", SHA-512 a fait l'objet de critiques approfondies par le NIST et d'autres. C'est bien, mais des défauts ont été reconnus qui, bien qu'ils ne soient pas exploitables maintenant, ont conduit à la compétition SHA-3 pour de nouveaux algorithmes de hachage. Gardez également à l'esprit que l'étude des algorithmes de hachage est "plus récente" que celle des chiffrements et que les cryptographes en apprennent encore plus.

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


Remarque: bcrypt est un algorithme qui utilise Blowfish en interne. Ce n'est pas un algorithme de chiffrement lui-même. Il est utilisé pour masquer les mots de passe de manière irréversible, tout comme les fonctions de hachage sont utilisées pour effectuer un "hachage unidirectionnel".

Les algorithmes de hachage cryptographiques sont conçus pour être impossibles à inverser. En d'autres termes, étant donné uniquement la sortie d'une fonction de hachage, il devrait prendre "indéfiniment" pour trouver un message qui produira la même sortie de hachage. En fait, il devrait être impossible de trouver deux messages qui produisent la même valeur de hachage. Contrairement à un chiffre, les fonctions de hachage ne sont pas paramétrées avec une clé; la même entrée produira toujours la même sortie.

Si quelqu'un fournit un mot de passe qui hache la valeur stockée dans la table des mots de passe, il est authentifié. En particulier, en raison de l'irréversibilité de la fonction de hachage, il est supposé que l'utilisateur n'est pas un attaquant qui s'est emparé du hachage et l'a inversé pour trouver un mot de passe de travail.

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

Afin de casser la cryptographie ici, un attaquant devrait récupérer la clé du texte chiffré. C'est ce qu'on appelle une attaque en "texte en clair connu", car l'attaque connaît la chaîne magique qui a été chiffrée, mais pas la clé utilisée. Blowfish a été étudié de manière approfondie, 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 digestions cryptographiques basées sur des algorithmes irréversibles, bcrypt produit une sortie 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 connues en texte clair, qui est analogue à une "première attaque pré-image" sur un algorithme de résumé. Puisqu'il peut être utilisé à la place d'un algorithme de hachage pour protéger les mots de passe, bcrypt est désigné par confusion comme un algorithme de «hachage» lui-même.

En supposant que les tables arc-en-ciel ont été contrecarrées par une bonne utilisation du sel, toute fonction vraiment irréversible réduit l'attaquant à des essais et erreurs. Et la vitesse à laquelle l'attaquant peut effectuer 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.

Si toutefois, la sortie du résumé est «renvoyé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 à l'intérieur de sa routine de dérivation de clés, et une méthode basée sur le hachage appropriée comme PBKDF2 fait la même chose; à cet égard, les deux méthodes sont similaires.

Donc, ma recommandation de bcrypt découle des hypothèses 1) qu'un Blowfish a eu un niveau d'examen similaire à la famille SHA-2 de fonctions de hachage, et 2) que les méthodes cryptanalytiques pour les chiffrements sont mieux développées que celles pour les fonctions de hachage.

erickson
la source
4
+1 grand message. Mais j'ai deux questions. Blowfish a été remplacé par deux poissons il y a plus d'une décennie, un système ne devrait-il pas utiliser des primitives modernes? De plus, des milliers d'itérations semblent inutiles dans des systèmes tels que les applications Web où de nombreuses personnes se connectent à un moment donné. Par exemple, PBKDF2 n'est implémenté que dans des scénarios lorsqu'une personne se connecte à la fois, comme une fonction string2key pour un système de fichiers chiffré. J'utilise l'adage "Si c'est trop lourd pour que l'attaquant se lève, alors c'est trop lourd pour votre serveur." Qu'est-ce que tu penses?
tour
17
Je ne pense pas qu'il y ait quelque chose de mal à utiliser une primitive plus moderne. Les vulnérabilités sont souvent découvertes avec le temps, et Twofish a été développé en utilisant les connaissances acquises de Blowfish. Cependant, je ne suis pas au courant de vulnérabilités spécifiques qui invalideraient l'utilisation de Blowfish, donc un argument "si ce n'est pas cassé" pourrait également être avancé. Votre adage sur les attaquants ne me semble pas bon. Même si vous choisissez un algorithme qui nécessiterait des années pour qu'un attaquant teste un milliard de mots de passe, il consommera une fraction de temps négligeable dans une application légitime.
erickson
15
Si vous regardez la spécification d'une fonction de hachage, vous ne verrez rien sur le "sel". Le seul paramètre est le message à digérer. Passez en revue les spécifications de tout chiffrement et vous verrez que la fonction est paramétrée avec une clé. Le «sel» qui peut (ou non ) être utilisé en conjonction avec un hachage fait simplement partie du message. L'algorithme de hachage ne l'exige pas, ne le traite pas spécialement et ne peut pas le différencier du reste du message. Ainsi, s'il est vrai que les messages sont souvent modifiés par le salage, un message donné ne produit qu'un seul hachage.
erickson
1
@Andre D En tant que pentester, je signale les applications qui verrouillent les comptes, et je signale les applications qui n'empêchent pas la force brute. Idéalement, une adresse IP fautive doit résoudre un captcha, en outre si un nom d'utilisateur est ciblé (même si ce nom d'utilisateur n'existe pas), ce compte doit résoudre un captcha avant de s'authentifier. L'application d'une limite de rat de X par minute est également acceptable. Connexes: security.stackexchange.com/questions/25444/…
tour
2
@rook: bien que la limitation des applications soit une bonne pratique, vous pouvez supposer dans ce cas que la base de données a été téléchargée et placée sur un équipement qui n'a pas la limite de taux que vous décrivez.
Ellert van Koperen
50

Je suis d'accord avec la réponse d'Erickson, avec une mise en garde: à des fins d'authentification par mot de passe, bcrypt est bien meilleur qu'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, lisez à nouveau l'article auquel vous avez lié (faites défiler jusqu'à "La vitesse est exactement ce que vous ne voulez pas dans une fonction de hachage de mot de passe. ").

Vous pouvez bien sûr créer 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 crypte de glibc (). Cependant, il n'y a aucune raison particulière de le faire si vous disposez déjà d'une implémentation bcrypt testée.

caf
la source
3
J'espère que ma réponse indique clairement qu'une seule itération de hachage n'est pas suffisante (malheureusement, même ce niveau rudimentaire de connaissances ne peut pas être supposé). "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. Si toutefois, la sortie du résumé est "renvoyé" 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… "
erickson
@erickson: Oui, même si je pense que vous y avez peut-être enterré la lede. Le point que j'essayais de faire est qu'une comparaison directe de bcrypt et SHA-512 n'est pas vraiment pertinente, car l'une est une fonction de dérivation de clé et l'autre est juste une primitive cryptographique, inadaptée en soi.
caf
1
L'utilisation de milliers de tours de SHA-512 n'est pas inconnue et compte tenu de son inclusion dans diverses cryptimplémentations (y compris en PHP que j'utilise), lorsque j'ai lu la question d'origine, j'ai même supposé que c'était ce que l'OP voulait dire quand il a posé des questions sur SHA-512 - qu'il faisait en fait référence à des milliers de tours de SHA-512 contre bcrypt qui utilise lui-même des centaines ou des milliers d'itérations.
thomasrutter
33

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 que vous pouvez le décrypter en texte brut.

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 d'origine.

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

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

Glen
la source
18
Je pense que la question concerne l'utilisation de bcrypt comme protection irréversible des mots de passe, tout comme le hachage est utilisé à cette fin.
erickson
3
@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
Glen
1
OP ici. En fait, sur la base de la réponse de Glen selon laquelle Blowfish est un algorithme de chiffrement (qui, je crois, est différent du hachage), je me rends compte maintenant que ma question oui était confuse. Ce qui est déroutant 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 un défaut, non? Suis-je en train de manquer quelque chose?
Chris
2
cependant, la question demande lesquelles des pommes et des kangourous conviennent le mieux à une tâche spécifique. Blowfish est une meilleure fonction de hachage que sha en raison du temps nécessaire au hachage. La plupart des implémentations de sha que j'ai vues sont très rapides. Vous voulez un algorithme lent pour le hachage de mot de passe.
John Nicholas
Cette réponse est correcte: Blowfish est un algorithme de cryptage, mais dans ce contexte (par exemple, lorsqu'il est utilisé dans bcrypt), il est utilisé comme algorithme de hachage en dérivant une clé de la chaîne source et en l'utilisant pour crypter un nombre magique. Cela le rend irréversible, essentiellement une fonction de hachage. Vous ne pouvez pas calculer la clé à partir d'un chiffre, même si vous connaissez le texte en clair et les données chiffrées.
thomasrutter
4

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

Blowdart
la source
2

Je recommanderais l'implémentation de cryptage basée sur SHA-256 / SHA-512 d'Ulrich Drepper.

Nous avons porté ces algorithmes sur Java, et vous pouvez en trouver une version sous licence gratuite sur ftp://ftp.arlut.utexas.edu/java_hashes/ .

Notez que la plupart des Unices (L) modernes prennent en charge l'algorithme de Drepper dans leurs fichiers / etc / shadow.

Jonathan Abbey
la source
PWDTK sourceforge.net/projects/pwdtknet utilise HMAC-SHA512 mais il le fait sur de nombreuses itérations pour créer une "lenteur" aka Key Stretching comme d'autres l'ont évoqué ici. BCrypt est meilleur qu'un seul SHA-512 comme cela a été mentionné, cependant si vous utilisez SHA-512 dans quelque chose comme PBKDF2 alors vous êtes bien sécurisé (Tant que vous utilisez un gros sel crypto-aléatoire et suffisamment d'itérations pour forcer le temps à faire une table arc-en-ciel) l'API que je viens de publier est construite par moi et fera ce que vous voulez dans .NET si c'est pour cela que vous développez (pour les futurs lecteurs)
thashiznets
2

Je viens de rencontrer ça:

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

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

disparu
la source
2
Ce n'est pas qu'il a tort, c'est juste qu'il ignore une multitude de littérature sur la façon d'appliquer des algorithmes de hachage, à savoir. ils doivent être utilisés de manière itérative dans les fonctions de dérivation de clés, tout comme le fait bcrypt.
erickson