Je ne comprends pas comment l'utilisation d'un sel aléatoire pour hacher des mots de passe peut fonctionner. Peut-être que le sel aléatoire fait référence à autre chose que le hachage des mots de passe? Voici mon processus de réflexion:
Le sel est utilisé pour ajouter de la malbouffe supplémentaire à la fin d'un mot de passe avant de le hacher, pour lutter contre la probabilité d'être fissuré par une table Rainbow
Cependant, pour vous assurer que vous pouvez toujours vérifier qu'un mot de passe est correct, vous devez utiliser le même sel pour chaque mot de passe avant de le chiffrer pour voir s'il correspond au hachage enregistré pour un certain utilisateur.
Si un sel aléatoire est utilisé, comment vérifier à nouveau ce mot de passe? Le sel aléatoire est-il enregistré quelque part pour être utilisé pour chaque cryptage? Semble moins sûr pour moi si le sel est enregistré juste à côté du mot de passe haché, plutôt que d'utiliser une sorte de sel calculé qu'un attaquant ne saurait intrinsèquement s'il a mis la main sur vos données.
Je ne sais pas si je manque quelque chose ici, ou si le salage aléatoire a à voir avec un scénario différent de cryptage, et n'a pas de sens dans ce cas particulier. Comment un sel aléatoire peut-il fonctionner dans le cas ci-dessus de hachage des mots de passe avant le cryptage?
Le sel aléatoire est-il enregistré quelque part pour être utilisé pour chaque cryptage?
Oui
Semble moins sûr pour moi si le sel est enregistré juste à côté du mot de passe haché, plutôt que d'utiliser une sorte de sel calculé qu'un attaquant ne saurait intrinsèquement s'il a mis la main sur vos données.
Ce n'est pas le cas, car la seule chose qu'un sel fait et a été inventé pour faire est, comme vous l'avez dit:
pour lutter contre la probabilité d'être fissuré par une table Rainbow
et rien de plus. Il ajoute de la complexité à un seul mot de passe - et pour chaque mot de passe dans une base de données, il est unique. Pour vérifier le mot de passe, vous devez le stocker à côté. Cela ne compromet en rien la sécurité de ce mot de passe unique - l'algorithme de hachage est toujours aussi sécurisé que sans sel.
Mais, en regardant l'ensemble de la base de données, chaque mot de passe est mieux protégé contre les attaques Rainbow, car l'attaquant doit calculer séparément un hachage unique avec le sel respectif et ne peut pas effectuer d'opérations en bloc sur eux.
Pour vérifier le mot de passe haché sans sel, vous calculez MD5(privided_password)
et compare avec les données stockées dans la base de données. Il effectue une recherche triviale sur une table de hachage pour décoder beaucoup de vos mots de passe. (Je sais que MD5 est faible pour le stockage des mots de passe, je l'utilise juste parce que les hachages sont plus courts que SHA-512, par exemple.)
Si vous utilisez du sel, vous devez calculer MD5(provided_password + salt)
et comparer avec la base de données. Comme le sel fait partie du hachage, vous stockez le sel dans la base de données et le mot de passe sur l'utilisateur.
Si 3 de vos utilisateurs ont passw0rd
comme mot de passe, et vous utilisez MD5 sans sel pour hacher vos mots de passe, et quelqu'un vole votre base de données, il peut voir quelque chose comme ceci:
|username | password |
|user1 | 71d00b760d017b2999eb54e32f41f592 |
|user7 | 71d00b760d017b2999eb54e32f41f592 |
|user13 | 71d00b760d017b2999eb54e32f41f592 |
Ainsi, dès que le pirate trouve un mot de passe dans une table de hachage (il y en a beaucoup en ligne), il connaît tous les autres.
La première étape consiste à utiliser un sel. Chaque mot de passe contiendra des données supplémentaires avant le hachage, mais le même sel est utilisé:
|username | salt | password |
|user1 | SALT | a66a96b36d78e452202c12d36b6d198c |
|user7 | SALT | a66a96b36d78e452202c12d36b6d198c |
|user13 | SALT | a66a96b36d78e452202c12d36b6d198c |
En utilisant ce schéma, le pirate devra brutaliser les hachages pour obtenir les mots de passe. Cela prendra un certain temps, mais dès qu'un mot de passe sera craqué, tous les autres seront également révélés.
La prochaine étape est le sel aléatoire. Chaque mot de passe aura un sel aléatoire différent:
|username | salt | password |
|user1 | SALT | a66a96b36d78e452202c12d36b6d198c |
|user7 | ASDF | 8062279f0ba04fa6ee41d0a9e04f4c93 |
|user13 | ABCD | 5743092bfb79214247c50c4102af0b99 |
Dans ce cas, même si tous vos utilisateurs ont le même mot de passe, le pirate ne peut pas connaître sans bruteforce chaque mot de passe. Dans cet exemple, le sel est très court, seulement 4 octets, mais vous pouvez utiliser des sels plus grands (128 octets ou plus) et augmenter la difficulté à forcer les mots de passe par bruteforce.