Comment peut-bcrypt ont intégré dans les sels?
Coda Hale de l'article "Comment Stocker en toute sécurité d'un Mot de passe" affirme que:
bcrypt a sels intégré pour éviter que l'arc-en-ciel de la table des attaques.
Il cite ce document, qui dit que dans OpenBSD de la mise en œuvre de bcrypt
:
OpenBSD génère 128 bits bcrypt de sel à partir d'un arcfour
(arc4random(3)) flux clé, ensemencés avec des données aléatoires du noyau
collecte à partir d'un périphérique de timing.
Je ne comprends pas comment cela peut fonctionner. Dans ma conception de sel:
- Il doit être différent pour chaque mot de passe enregistré, ainsi qu'un arc-en-ciel de la table devrait être généré pour chaque
- Il doit être stocké quelque part alors que c'est répétitif: lorsqu'un utilisateur essaie de se connecter, nous prenons leur tentative de mot de passe, répétez la même sel et le hachage de procédure nous avons fait lorsque nous avons été stocké à l'origine de leur mot de passe, et de les comparer
Quand je suis à l'aide de Concevoir (Rails gestionnaire de connexion) avec bcrypt, il n'y a pas de sel de la colonne dans la base de données, donc je suis confus. Si le sel est aléatoire et ne sont pas stockées n'importe où, comment peut-on de manière fiable répétez le processus de hachage?
En bref, comment peut-bcrypt ont intégré dans les sels?
Vous devez vous connecter pour publier un commentaire.
C'est bcrypt:
La génération aléatoire de sel. Un "coût" facteur a été pré-configuré. Recueillir un mot de passe.
Dériver une clé de chiffrement du mot de passe en utilisant le sel et le facteur de coût. L'utiliser pour crypter une chaîne connue. Magasin le coût, sel, et le texte chiffré. Parce que ces trois éléments ont une longueur connue, il est facile de les enchaîner et de les stocker dans un seul champ, mais être en mesure de séparer les distingue plus tard.
Quand quelqu'un essaie de s'authentifier, de récupérer la stockées coût et le sel. Dériver une clé de mot de passe d'entrée, le coût et le sel. Chiffrer le même bien connu de la chaîne. Si l'généré le texte chiffré correspond à la stockées texte chiffré, le mot de passe est un match.
Bcrypt fonctionne de manière très similaire à plus traditionnels schémas basés sur des algorithmes comme PBKDF2. La principale différence est l'utilisation d'un dérivé de la clé pour chiffrer connu en texte brut; d'autres régimes (raisonnablement) assumer la fonction de dérivation de clé est irréversible, et de stocker la clé dérivée directement.
Stockées dans la base de données, un
bcrypt
"hash" pourrait ressembler à quelque chose comme ceci:C'est en fait trois champs délimités par des "$":
2a
identifie lebcrypt
algorithme version qui a été utilisé.10
est le facteur de coût; 210 d'itérations de la fonction de dérivation de clé sont utilisés (ce qui n'est pas assez, par la manière. Je recommanderais un coût de 12 ou plus).vI8aWBnW3fID.ZQ4/zo1G.q1lRps.9cGLcZEiGDMVr5yUP1KUOYTa
est le sel et le texte chiffré, concaténés et encodé dans une modification de la Base-64. Les 22 premiers caractères de décodage de 16 octets de la valeur pour le sel. Les autres personnages sont de chiffrement de texte pour être comparé à des fins d'authentification.Cet exemple est tiré de la documentation pour Coda Hale ruby mise en œuvre.
crypt
(CRYPT_BLOWFISH
). Je suis vissé?crypt()
fonction est mise en œuvre par plus de code PHP, ou il est effectivement mis en œuvre par une bibliothèque compilé (écrit en C ou C++ et compilé pour l'hôte de l'architecture)? Si ce dernier, il semble que ça devrait être rapide.bcrypt
clé algorithme de génération de est très lent, beaucoup plus lent que la PBKDF2 avec l'algorithme SHA-1 HMAC j'avais supposé était comparable lorsque j'ai recommandé un facteur de coût.bcrypt
avec un facteur de coût de 16 prend environ 5,6 secondes sur ma machine. En ce moment, je peux faire presque 4 millions de PBKDF2 itérations. Ainsi, le facteur de coût pour la bcrypt pourrait être en toute sécurité abaissé, peut-être à 12. Cela devrait prendre moins de 1 seconde, même sur votre hôte.crypt()
mise en œuvre. Je ne suis pas au courant de tout "désinformation" si. Pouvez-vous préciser?"OrpheanBeholderScryDoubt"
Je crois que la phrase doit avoir été rédigé comme suit:
La
bcrypt
utilitaire lui-même ne semble pas à jour une liste de sels. Plutôt, les sels sont générées aléatoirement et ajoutés à la sortie de la fonction, de sorte qu'ils sont de rappeler plus tard (selon la Java de la mise en œuvre debcrypt
). Mettre une autre manière, le "hash" généré parbcrypt
n'est pas juste le hachage. C'est plutôt le hachage et le sel concaténées.Bcrypt
ajoute un hasard sel de "akd2!*", résultant dans "fooakd2!*", qui est haché et stockées. Plus tard, j'ai essayer de vous connecter avec le mot de passe "bar". Pour voir si je suis correct, il a besoin de hachage "barakd2!*". Si le sel a été généré de façon aléatoire pour commencer, comment sait-il comment faire pour ajouter la "barre" avant le hachage et la comparaison?bcrypt
sépare la sortie originale dans son hachage et le sel composants. Le sel composant est appliqué à l'entrée mot de passe saisi par l'utilisateur.C'est à partir de PasswordEncoder documentation de l'interface à partir du Printemps de Sécurité,
Ce qui signifie que l'on devra correspondre rawPassword que l'utilisateur va entrer de nouveau lors de votre prochaine connexion et correspond avec Bcrypt codé mot de passe est stocke dans la base de données lors des précédentes connexion/inscription.