J'ai lu plusieurs des questions à ce sujet, mais de nombreuses réponses se contredisent mutuellement ou je ne comprends pas. P>
Vous devez toujours stocker un mot de passe comme un hachage, jamais en tant que texte brut. Mais devriez-vous stocker le sel (unique pour chaque utilisateur) à côté du mot de passe haché + sel dans la base de données. Cela ne me semble pas très intelligent pour que quelqu'un ne puisse pas avoir accès à la base de données, recherchez-la indique le compte appelé administrateur ou quoi que ce soit, puis et ensuite le mot de passe de cela? P>
6 Réponses :
Le sel est destiné à déranger les meubles arc-en-ciel existants. Ce n'est pas une menace de sécurité de connaître le sel. Si vous connaissez le sel, vous auriez toujours besoin de connaître le mot de passe. p>
mais sûrement si sel + mot de passe = hachage puis hachage - sel = mot de passe?
vaguement, mais rappelez-vous que le hachage est un algorithme à sens unique. [do_hash (sel + mot de passe) = hashed_password. ] Si un sel est connu, l'attaquant doit exécuter do_hash (sel + Password_guess) pour chaque tentative de mot de passe, afin de construire une table arc-en-ciel ou une attaque de force brute / dictionnaire chaque mot de passe. Changez le sel pour chaque utilisateur et cela laisse un très grand espace de recherche.
Mais pourquoi l'attaquant veut-il sûrement tous les mots de passe des utilisateurs qu'il chercherait simplement admin admin, etc.
@Jonathan Ce n'est pas seulement le mot de passe de l'administrateur qui est en général. Beaucoup de gens utilisent le même mot de passe sur différents sites. De cette façon, vous pouvez garder leur mot de passe plus sûr, les attaques ne peuvent pas obtenir leurs mots de passe de votre base de données.
Eh bien d'abord, l'objectif principal du sel est de désactiver la forçage brute des mots de passe, par exemple, il empêche l'utilisation des tables arc-en-ciel pour compromettre rapidement un mot de passe.
Même si un attaquant gagne à l'accès à Une base de données, ce n'est pas si facile de déterminer les mots de passe réels des sels (surtout si vous n'avez pas le code et que vous ne savez pas comment le mot de passe est haché). Cependant, ce que j'aime faire pour que la sécurité supplémentaire consiste également à utiliser un mot de passe avec un hachage statique spécifié dans le code. De cette façon, il ne suffit pas de compromettre la base de données. Un exemple de cette méthode (en PHP): p> $ user_salt code> est le sel de la base de données unique à chaque utilisateur,
$ static_salt code> est le sel spécifié dans les paramètres de votre code quelque part. p> p>
Je ne suis pas convaincu que cela fait de manière significative plus que de donner un faux sentiment de sécurité.
Comme Grimmy a déclaré, si quelqu'un compromet la base de données et obtient des mots de passe et des sels hachés à l'utilisateur, ils peuvent utiliser ceux-ci pour générer de nouvelles tables arc-en-ciel (en supposant qu'ils connaissent la méthode de hachage utilisée, que vous pouvez facilement comprendre en cas de logiciel open-source). Si vous incluez également un sel non stocké dans la base de données dans le mot de passe haché, un attaquant ne peut générer qu'une nouvelle table arc-en-ciel en compromettant uniquement la base de données. Ce n'est pas juste un faux sentiment de sécurité.
Vous ne pouvez pas générer des tables arc-en-ciel s'il existe différents sels pour chaque utilisateur. Je vois ce que REKO_T a suggéré d'utiliser beaucoup et je suis aussi incertain si cela ajoute vraiment de la sécurité. J'ai une idée d'une situation où il fait: Si vous aviez une très grande base de données, chaque hachage de mot de passe était comme s'il l'a dit, mais sans le sel statique: vous pouvez exécuter des requêtes par exemple pour chaque utilisateur, hachage "1234" + user_salt et stocker des correspondances. Vous seriez garanti de compromettre une poignée de comptes. S'il y avait un hachage de site inconnu, ce vecteur ne serait pas possible et de trouver le hachage serait extrêmement difficile.
Si vous ne stockez pas le sel, comment vérifierez-vous si le mot de passe correct a été fourni? p>
Je voulais dire si vous le stockez dans la base de données principale plutôt que quelque part ailleurs
@Jonathan - Stockez-le dans la même table de base de données en plus des colonnes Loginid et mot de passe. Peu importe si le sel est compromis.
Le sel est utilisé pour augmenter le temps qu'un attaquant devrait dépenser pour trouver un mot de passe correspondant à la haquephe stockée dans la base de données. Table de recherche typique telle que la table arc-en-ciel (voir http://fr.wikipedia.org/wiki/rainbow_tabledech_Table A>) est utilisé pour y parvenir. p>
Quels coûts ne sont pas la recherche elle-même, mais le temps de calculer la table arc-en-ciel. Ajouter une force de sel L'attaquant de recalculer une nouvelle table arc-en-ciel, même si elle est connue par l'attaquant qui compromettrait la base de données p>
Un sel fabrique également les hachages stockés, même si deux utilisateurs ont le même mot de passe.
@Anders Abel - Seulement statistiquement parler. Bien entendu, cela dépend de la taille du sel et de la base d'utilisateurs, mais avec le mauvais mot de passe basé sur Unix Unix, il n'y a que 12 bits de sel, donc si nous avons 4097 utilisateurs ayant le même mot de passe, au moins deux aura des hashes identiques.
Le calcul d'une table arc-en-ciel vaut totalement la peine de dire 100 000 utilisateurs. Le point est que vous ne pouvez pas le faire si le sel est différent pour chaque utilisateur - Computing 100 000 tables arc-en-ciel serait inutile.
Beaucoup de gens disent "d'arrêter les tables arc-en-ciel" sans expliquer ce que font les tables arc-en-ciel ou pourquoi cela les arrête. P>
Les tables arc-en-ciel sont un moyen intelligent de précompter un grand nombre de haubans et de les stocker en moins de mémoire que naïvement requises, et vous pouvez les utiliser pour inverser très rapidement un hachage. Tables pour fonctions nues telles que Cependant, ils peuvent être générés pour toute fonction de hachage pouvant être décrite comme Si le sel est différent pour chaque mot de passe, vous ne pouvez pas générer une table arc-en-ciel qui craquera tous les mots de passe de la base de données. Vous pouvez générer un nouveau pour chaque utilisateur, mais ce serait inutile - la force brute naïf ne serait pas plus lente. Donc, avoir un sel séparé pour chaque utilisateur arrête l'attaque des tables arc-en-ciel. P>
Il y a plusieurs façons de faire cela. Moyens populaires incluent: p>
Avoir un sel global pourrait ajouter une petite complexité supplémentaire à la fissuration des mots de passe, car elle pourrait être stockée en dehors de la base de données (dans le code, par exemple) que les attaquants peuvent ne pas avoir accès à une brèche de base de données. Cryptographiquement je ne pense pas que cela ajoute beaucoup, mais en pratique, cela pourrait les ralentir. P>
stocker le sel aux côtés des données utilisateur n'entraits pas le hachage. Les fonctions de hachage sont à sens unique: étant donné le hachage d'un mot de passe, même non étalé, il est très difficile de trouver ce mot de passe. La motivation derrière la salage ne doit pas rendre un hachage individuel plus sûr, mais pour rendre la collection de multiples hachages plus sécurisés. Il existe plusieurs vecteurs d'attaque pour une collection de hachages non salées: p>
hash = md5 (mot de passe) code> et
hachage = SHA1 (mot de passe) code> sont courants. P>
sortie = f (entrée) code>. Si vous utilisez un sel à l'échelle du site pour tous les mots de passe utilisateur, par exemple
hash = md5 (sel + mot de passe) code>, vous pouvez construire une fonction
f code>,
f ( Mot de passe) = MD5 (sel + mot de passe) code>. Par conséquent, vous pouvez générer des tables arc-en-ciel pour cette fonction, ce qui prendrait beaucoup de temps, mais vous permettrait de craquer chaque mot de passe unique dans la base de données très rapidement. P>
hachage = hachage (sel + mot de passe) code> li>
hachage = hashfunction (sel + mot de passe + user_id) code> Par exemple li>
hash = hashfunction (global_salt + user_salt + mot de passe) code> li>
ul>
123 code>,
mot de passe code>,
dieu code>) et voyant s'il existe dans la base de données, puis compromettre ces comptes li>
Par "un hachage global et un hachage par utilisateur" Vous voulez dire "un sel global B> et un par utilisateur sel b>", non? Semblable dans d'autres phrases ...
Est-ce que le "+" dans "sel + mot de passe" signifie addition littéral?
Le + est utilisé pour représenter une combinaison, qui est souvent une concaténation dans la pratique. Cependant, je ne veux pas dire "C'est la bonne façon de le faire", car honnêtement, je ne sais pas s'il y a des bugs subtils à éviter dans cette construction. La bonne réponse est que vous devez utiliser une bibliothèque de hachage de mots de passe moderne qui vous gère pour vous - ces détails ne doivent pas être sous votre contrôle.
Bien bien .. Tant de discussions ... tant d'informations. Tant de questions ... Je vois qu'après toutes les questions des réponses, voici le résumé. P>
Voici ma compréhension. P>
OK..cône non complète, mais mon point est mauvais, les méchants prennent beaucoup de temps ... mais les bons gars ont une longueur d'avance pour s'assurer qu'ils connaissent la technologie que les mauvais gars utiliseront pour craquer. Donc, il suffit de concevoir une meilleure technologie de temps. P>
Prends soin de toi .... p>
Stackoverflow.com/Questtions/213380/...