L'article de Coda Hale «Comment stocker un mot de passe en toute sécurité» affirme que:
bcrypt a des sels intégrés pour empêcher les attaques de table arc-en-ciel.
Il cite cet article , qui dit que dans la mise en œuvre d'OpenBSD de bcrypt
:
OpenBSD génère le sel bcrypt 128 bits à partir d'un flux de clés arcfour (arc4random (3)), ensemencé avec des données aléatoires que le noyau recueille à partir des synchronisations des périphériques.
Je ne comprends pas comment cela peut fonctionner. Dans ma conception d'un sel:
- Il doit être différent pour chaque mot de passe stocké, de sorte qu'une table arc-en-ciel distincte devrait être générée pour chaque
- Il doit être stocké quelque part afin qu'il soit reproductible: lorsqu'un utilisateur essaie de se connecter, nous prenons sa tentative de mot de passe, répétons la même procédure de sel et de hachage que nous avons faite lorsque nous avons initialement stocké son mot de passe et comparons
Lorsque j'utilise Devise (un gestionnaire de connexion Rails) avec bcrypt, il n'y a pas de colonne de sel dans la base de données, donc je suis confus. Si le sel est aléatoire et n'est stocké nulle part, comment pouvons-nous répéter de manière fiable le processus de hachage?
En bref, comment bcrypt peut-il avoir des sels intégrés ?
"OrpheanBeholderScryDoubt"
Je pense que cette phrase aurait dû être formulée comme suit:
L'
bcrypt
utilitaire lui-même ne semble pas tenir une liste de sels. Au contraire, les sels sont générés de manière aléatoire et ajoutés à la sortie de la fonction afin qu'ils soient mémorisés plus tard (selon l'implémentation Java debcrypt
). Autrement dit, le «hachage» généré parbcrypt
n'est pas seulement le hachage. Il s'agit plutôt du hachage et du sel concaténés.la source
Bcrypt
ajoute un sel aléatoire de "akd2! *", résultant en "fooakd2! *", qui est haché et stocké. Plus tard, j'essaye de me connecter avec le mot de passe "bar". Pour voir si j'ai raison, il faut hacher "barakd2! *". Si le sel a été généré de manière aléatoire pour commencer, comment sait-il comment l'ajouter à nouveau à "bar" avant de le hacher et de le comparer?bcrypt
sait comment extraire le sel de la sortie générée (qui est stockée dans la base de données). Quand vient le temps de s'authentifier,bcrypt
sépare la sortie d'origine en ses composants de hachage et de sel. Le composant salt est appliqué au mot de passe entrant saisi par l'utilisateur.Pour rendre les choses encore plus claires,
Inscription / Direction de connexion ->
Le mot de passe + sel est crypté avec une clé générée à partir de: cost, salt et le mot de passe. nous appelons cette valeur chiffrée le
cipher text
. puis nous attachons le sel à cette valeur et l'encodons en utilisant base64. y attacher le coût et c'est la chaîne produite à partir debcrypt
:$2a$COST$BASE64
Cette valeur est éventuellement stockée.
Que devrait faire l'attaquant pour trouver le mot de passe? (autre direction <-)
Dans le cas où l'attaquant aurait pris le contrôle de la base de données, l'attaquant décodera facilement la valeur base64, puis il pourra voir le sel. le sel n'est pas secret. bien qu'il soit aléatoire. Ensuite, il devra déchiffrer le
cipher text
.Ce qui est plus important: il n'y a pas de hachage dans ce processus, mais un chiffrement - déchiffrement coûteux du processeur. les tables arc-en-ciel sont donc moins pertinentes ici.
la source
Il s'agit de la documentation de l'interface PasswordEncoder de Spring Security,
Ce qui signifie, il faudra faire correspondre rawPassword que l'utilisateur entrera à nouveau lors de la prochaine connexion et le faire correspondre avec un mot de passe codé Bcrypt qui est stocké dans la base de données lors de la connexion / inscription précédente.
la source