web-dev-qa-db-fra.com

Expliquez BCrypt comme si j'avais 5 ans

Je sais que c'est un peu large, mais j'aimerais comprendre la fonction de cet algorithme en expliquant comme je suis 5. Et j'aimerais connaître la différence entre BCrypt et blowfish, est-ce parce que BCrypt utilise un sel?

J'ai lu mais je vois des informations à un bas niveau, et je ne veux pas aller aussi loin, je voudrais obtenir une explication plus simple (connaître les bases comme le sel, les bits, etc.).

Par exemple, je sais que la première partie d'un mot de passe est:

$2$: Blowfish-based crypt ('bcrypt')

Et puis le deuxième est les tours. Par exemple, $10$ indique 2 ^ 10 tours d'extension clés, mais qu'est-ce que cela signifie exactement?

Un exemple de réponse serait:

  1. Vous faites d'abord le sel avec l'algorithme X
  2. Ensuite, obtenez un nombre aléatoire de X
  3. Ensuite, avec le tour, vous faites X

Quelque chose comme ça, j'espère que c'est clair.

5
Skizo-ozᴉʞS

Bcrypt utilise Blowfish chiffrement par bloc à clé symétrique et accepte 3 paramètres; coût, sel et mot de passe.

  • Le coût est déterminé par le niveau du système afin que l'administrateur puisse décider du moment de l'attaque de recherche de mot de passe, voir hashcat . Il détermine le nombre d'itérations comme iter= 2^cost dont le coût est compris entre 2 et 31.

  • Le sel est un aléatoire de 16 octets. Il peut être généré n'importe quelle bonne source aléatoire comme \dev\urandom

  • Le mot de passe est le mot de passe de l'utilisateur à traiter. La taille des mots de passe est de 1 à 72 octets.

  • La sortie de Bcrypt est de 24 octets.

Le Bcrypt crypte le texte OrpheanBeholderScryDoubt dans un mode ECB chaîné.

 state = EksBlowfishSetup(cost, salt, password) //Special key scheduling 
 ctext = "OrpheanBeholderScryDoubt"
 repeat (64)
      ctext = EncryptECB(state, ctext)
 return Concatenate(cost, salt, ctext)

mise à jour sur le coût

EksBlowfishSetup (Configuration de clé étendue) brièvement comme suit;

state = InitialState()
state = ExpandKey(state, salt, password)
repeat (2^cost)
    state = ExpandKey(state, 0, password)
    state = ExpandKey(state, 0, salt)

Le coût joue un rôle sur la fonction ci-dessus de BCrypt. Avec l'augmentation des coûts, la boucle de répétition fonctionnera de façon exponentielle. Cela augmentera le temps d'attaque comme vous pouvez le voir sur tableau de cette réponse . Si vous voulez le comparer avec le hashcat, voir une référence pour Tesla K8

Remarque: que Bcrypt est ancien (1999), vous devez utiliser Argon2i comme gagnant du hachage de mot de passe compétition .

7
kelalaka

Hachage contre cryptage

La plus grande différence entre bcrypt et blowfish est que blowfish est un algorithme de cryptage symétrique et bcrypt est un algorithme de hachage. (Il s'agit d'un type spécial d'algorithme de hachage, mais nous y reviendrons plus tard.)

Cryptage (ce que fait Blowfish)

Un algorithme de chiffrement symétrique prend une clé secrète et du texte en clair (le terme "message" est régulièrement utilisé et la variable m est généralement utilisée pour s'y référer) et génère un texte chiffré, c . L'idée est que le texte chiffré ne peut être retransformé que dans le message d'origine avec la même [^ même] clé secrète qui a été utilisée lors du chiffrement.

[^ même]: Je donne des réponses approximativement vraies ici pour me concentrer sur les idées et les concepts centraux. J'espère que ceux qui reconnaîtront où mes réponses ne sont pas exactement vraies me couperont du temps à des fins d'exposé.

Alice peut donc chiffrer le message "Attaque à l'aube" avec la clé 13 (c'est pas Blowfish, mais c'est un chiffrement symétrique) et produire le texte chiffré " Nggnpx ng qnja ". Elle peut envoyer ce texte chiffré à Bob, et si Bob sait que la clé est 13, il peut retransformer le texte chiffré en messages d'origine. Parfois, Alice ne veut pas envoyer de message à une autre personne, mais elle veut le stocker pour qu'elle puisse le lire plus tard. Nous pouvons considérer ces cas comme Alice envoyant un message à la future Alice.

Avec Blowfish (au lieu du cryptage que j'ai utilisé dans mon exemple), il est effectivement impossible pour quiconque n'a pas la clé d'apprendre quoi que ce soit sur le message d'origine (autre que sa longueur et son existence) à partir du texte chiffré. Juste un côté, AES est un algorithme de chiffrement symétrique préférable à Blowfish, mais je continuerai à utiliser Blowfish dans mes descriptions car c'est ce qui a été demandé.

Hachage

Un algorithme de hachage cryptographique (bcrypt est un type spécial, avec quelques extras, mais je vais commencer par un cas plus simple) ne prend pas de clé et n'est pas pratiquement réversible. Ainsi, un algorithme de hachage cryptographique comme SHA256 prendrait un message (disons un mot de passe) comme "JaguarsRule!" et le transformer en hachage.

$ echo -n 'JaguarsRule!' | shasum -a256
13f26e5a60e402d895c5ce1d9492d080563c5079a8b5f52a25953fd24a2cb1da  

L'une des nombreuses propriétés d'un hachage cryptographique est qu'il est impossible de calculer "JaguarsRule!" de 13f26e5a60e402d895c5ce1d9492d080563c5079a8b5f52a25953fd24a2cb1da. Il n'y a pas de clé dans ce cas.

Un mécanisme de hachage simple comme celui-ci peut donc sembler un bon moyen de vérifier les mots de passe sur un serveur. Supposons que vous exécutez un service Web auquel des personnes se connectent. Vous avez un utilisateur, disons avec le nom d'utilisateur jason qui crée son compte avec le mot de passe JaguarsRule!. Parce que vous ne voulez pas que quiconque sachant ce qui se trouve sur votre serveur connaisse le mot de passe de Jason, vous ne stockez pas le mot de passe lui-même. Au lieu de cela, vous stockez son hachage.

Lorsque jason (ou quelqu'un prétendant être jason) se connecte à votre serveur prend le mot de passe qui est entré et effectue l'opération de hachage dessus et compare le hachage qui est stocké. Si les hachages correspondent, le système sait que le mot de passe correct a été entré.

Sels et cuisson lente

Le schéma décrit ci-dessus, utilisant un hachage cryptographique général comme SHA256, fonctionnerait très bien, sauf pour une chose: les gens choisissent des mots de passe devinables. Si les gens étaient aussi susceptibles d'utiliser des mots de passe comme wZFoO_SKrgEw comme ils sont à JaguarsRule! alors nous n'aurions pas besoin de fonctions de hachage spécialisées comme bcrypt. Mais les gens, étant humains, ne vont pas choisir les mots de passe au hasard et uniformément sur un espace suffisamment grand. Au lieu de cela, ils sont beaucoup plus susceptibles de choisir certains mots de passe possibles que d'autres.

Sel

Considérez un autre utilisateur de votre système, pillboy. Pill Boy est aussi un fan des Jaguars de Jacksonville et a également choisi JaguarsRule! comme mot de passe. En utilisant le hachage (non salé), le hachage du mot de passe de Pill Boy sera le même que le hachage du mot de passe de Jason. Un attaquant n'a besoin que de comparer les hachages pour voir que ces deux utilisateurs ont le même mot de passe.

De plus, si un attaquant découvre d'une manière ou d'une autre que le mot de passe de Jason est JaguarsRule! `, Il connaît immédiatement le mot de passe de Pill Boy. De plus, elle pourrait créer une grande liste de hachages pour les mots de passe les plus courants.

La solution est de saler le mot de passe avec quelque chose d'unique avant de le hacher. Ainsi, lorsque vous créez pour la première fois le hachage du mot de passe de Jason (lorsque Jason s'inscrit pour la première fois et crée le mot de passe), vous y ajoutez des éléments aléatoires. Supposons qu'à ce moment, votre système crée le sel 9cb3779f69e271c1. Il colle ensuite cela devant le mot de passe avant de hacher, donc il s'agit vraiment de quelque chose comme 9cb3779f69e271c1JaguarsRule! (Ce n'est pas ainsi que le sel est ajouté, mais c'est assez près pour expliquer à quoi sert le sel.). Le hachage de 9cb3779f69e271c1JaguarsRule! sera complètement différent du hachage de JaguarsRule!.

Le système devra savoir quel était le sel au moment de vérifier un mot de passe. Il stockera donc le sel et le hachage avec le nom d'utilisateur de Jason. Lorsque Pill Boy crée son compte, il sera configuré avec un sel différent généré de manière aléatoire, et donc sa combinaison sel et mot de passe produira un hachage différent.

Donc, ce que vous stockez sur votre serveur pourrait ressembler à ceci

[
    {
        "algorithm": "sha256",
        "username": "jason",
        "salt": "9cb3779f69e271c1",
        "hash": "37a932267ed055facf03cc5d09ca90f927a1eed47a8cd4856e57cd67434426be"
    },
    {
        "algorithm": "sha256",
        "username": "pillboy",
        "salt": "0a19471dab710025",
        "hash": "4be637a8c85455dce0cdc1c7670f062764100276b6ed64141c06fbef4578f185"
    },

]

En ayant des sels différents pour ces utilisateurs, nous ne pouvons pas voir qu'ils ont le même mot de passe, et l'attaquant ne pourra pas comparer les hachages à une liste qu'elle a précalculée de hachage de mots de passe courants.

Donc, bcrypt, car il est conçu pour le hachage de mot de passe, prend un sel.

Prendre lentement

Le salage est absolument essentiel, mais il n'empêche toujours pas un attaquant qui s'empare de ce qui est stocké sur le serveur de deviner automatiquement. Elle peut prendre le sel et le combiner avec des mots de passe courants et calculer des hachages jusqu'à ce qu'elle trouve une correspondance. Elle pourrait être en mesure d'effectuer des dizaines ou des centaines de millions de suppositions de mot de passe par seconde.

L'une des raisons pour lesquelles elle peut calculer de nombreuses suppositions si rapidement est que les algorithmes de hachage cryptographique comme sha256 sont conçus pour être rapides et efficaces tout en respectant leurs propriétés de sécurité. Donc, des choses comme bcrypt font du "hachage lent". L'idée est que passer d'un message (sel et mot de passe) à un hachage peut prendre tellement de calculs qu'un ordinateur typique prendra un quart de seconde pour effectuer le hachage.

L'utilisateur ne remarquera pas un quart de seconde de retard, mais si l'attaquant utilise le même type d'ordinateur, il finit par être réduit à faire quatre suppositions par seconde au lieu de 10 millions. (En pratique, elle aura un équipement informatique spécialement configuré, mais la ralentir de millions de suppositions par seconde à des dizaines de milliers de suppositions par seconde est une bonne chose.)

bcrypt est l'un des nombreux "hachages lents". D'autres sont PBBKDF2, scrypt et Argon2. Ces deux derniers nécessitent non seulement beaucoup de calculs pour créer le hachage, mais nécessitent également beaucoup de mémoire.

Bcrypt est génial, mais ...

Le salage et le hachage lent sont quelque chose que tout système de hachage de mot de passe devrait faire. Mais cela donne également des rendements décroissants. Il y a tellement de choses que le hachage lent peut faire pour le défenseur, et nous devons donc (tant que les mots de passe existent) amener les gens à utiliser plus difficile à deviner. J'ai écrit plus à ce sujet dans Bcrypt est génial, mais ...

NB: Merci https://security.stackexchange.com/users/6253/schroeder pour avoir supprimé correctement ma réponse précédente dans laquelle j'avais pris "comme si j'avais 5 ans" littéralement. Et mes excuses à l'affiche originale pour avoir été sournoise au lieu d'être utile.

6
Jeffrey Goldberg