111 votes

La nécessité de cacher le sel pour une table de hachage

Au travail, nous avons deux théories concurrentes pour les sels. Les produits que je travail sur utiliser quelque chose comme un nom d'utilisateur ou numéro de téléphone pour le sel de la table de hachage. Essentiellement quelque chose qui est différent pour chaque utilisateur mais il est facilement disponible pour nous. L'autre produit génère aléatoirement un sel pour chaque utilisateur et à chaque fois que l'utilisateur change le mot de passe. Le sel est ensuite crypté dans la base de données.

Ma question est de savoir si la seconde approche est-elle vraiment nécessaire? Je peux comprendre, d'un point de vue purement théorique qu'elle est plus sûre que la première approche, mais qu'à partir d'une pratique de point de vue. Maintenant pour authentifier un utilisateur, le sel doit être clair et appliqué pour les informations de connexion.

Après réflexion, je ne vois pas un réel gain de sécurité de cette approche. Modification du sel de compte à compte, fait qu'il est encore extrêmement difficile pour quelqu'un de tenter de la force brute de l'algorithme de hachage, même si l'attaquant a été conscient de la façon de rapidement déterminer ce qu'il était pour chaque compte. C'est en allant sur l'hypothèse que les mots de passe sont suffisamment fortes. (Évidemment de trouver la bonne valeur de hachage pour un jeu de mots de passe, où ils sont tous deux chiffres est beaucoup plus facile que de trouver le bon hash de mots de passe de 8 chiffres). Je suis incorrect dans ma logique, ou est-il quelque chose que je suis absent?

EDIT: Bon alors voici la raison pourquoi je pense que c'est vraiment discutable pour chiffrer le sel. (lemme de savoir si je suis sur la bonne voie).

Pour l'explication qui suit, nous allons supposer que les mots de passe sont toujours 8 caractères et le sel est 5 et tous les mots de passe composé de lettres minuscules (il fait juste les maths plus facile).

Ayant un autre sel pour chaque entrée signifie que je ne peux pas utiliser le même arc-en-ciel de la table (en fait, techniquement, je pourrais si j'en avais un de taille suffisante, mais ignorons le fait que pour le moment). C'est la véritable clé pour le sel de ce que je comprends, parce que pour le crack de chaque compte que j'ai de réinventer la roue, afin de parler de chacun d'eux. Maintenant, si je sais comment appliquer le bon de sel à un mot de passe pour générer le hachage, je le ferais, car un sel vraiment juste s'étend de la longueur et de la complexité du haché de la phrase. Donc, je serais d'une réduction du nombre de combinaisons possibles, j'ai besoin de générer de "savoir" j'ai le mot de passe + le sel de 13^26 à 8^26 parce que je sais ce que le sel est. Maintenant que c'est plus facile, mais encore très dur.

Donc sur le chiffrement du sel. Si je sais que le sel est crypté, je n'essayez pas de les déchiffrer (en supposant que je sais qu'il a un niveau suffisant de chiffrement) en premier. Je l'ignorer. Au lieu d'essayer de comprendre comment le décrypter, revenons à l'exemple précédent, je voudrais juste générer un plus grand arc-en-ciel de la table contenant toutes les clés pour la 13^26. Ne connaissant pas le sel serait certainement me ralentir, mais je ne pense pas que ce serait ajouter de la tâche monumentale d'essayer de casser le sel de chiffrement en premier. C'est pourquoi je ne pense pas que ça en vaut la peine. Pensées?

Voici un lien qui décrit combien de temps les mots de passe peut contenir jusqu'en vertu d'une attaque par force brute: http://www.lockdown.co.uk/?pg=combi

107voto

erickson Points 127945

Le masquage d'un sel est inutile.

Un autre sel devrait être utilisé pour chaque hachage. Dans la pratique, cela est facile à réaliser par l'obtention de 8 octets ou plus à partir de chiffrement de qualité générateur de nombre aléatoire.

À partir d'une précédente réponse de la mienne:

Le sel aide à contrecarrer les pré-calculé les attaques de dictionnaire.

Supposons qu'un attaquant a une liste de probablement les mots de passe. Il peut hachage de chacun et de la comparer à la valeur de hachage de sa victime du mot de passe, et voir si elle correspond. Si la liste est grande, ce qui pourrait prendre du temps. Il ne veut pas passer autant de temps sur sa prochaine cible, de sorte qu'il enregistre le résultat dans un "dictionnaire" où un hachage de points correspondant à son entrée. Si la liste de mots de passe est très, très longtemps, il peut utiliser des techniques comme un arc en ciel Table d'économiser de l'espace.

Cependant, supposons que sa prochaine cible salés leur mot de passe. Même si l'attaquant sait ce que le sel est, son précalculées table de peu de valeur-le sel des changements de la valeur de hachage à la suite de chaque mot de passe. Il a re-hachage de tous les mots de passe dans sa liste, l'apposition de la cible du sel à l'entrée. Chaque sel nécessite un autre dictionnaire, et si suffisamment de sels sont utilisés, l'attaquant n'aura pas de place pour stocker les dictionnaires pour eux tous. L'espace de Trading pour gagner du temps n'est plus une option, l'attaquant doit revenir pour le hachage de mot de passe dans sa liste, pour chaque objectif, il veut attaquer.

Donc, il n'est pas nécessaire de garder le sel de secret. Veiller à ce que l'attaquant ne dispose pas d'un pré-calculé dictionnaire correspondant à ce sel est suffisante.


Après y avoir réfléchi un peu plus, j'ai réalisé que tromper vous-même en pensant que le sel peut être caché, est dangereux. C'est beaucoup mieux d'assumer le sel ne peut être cachée, et la conception du système pour être en sécurité en dépit de cela. Je vais vous donner une explication plus détaillée dans une autre réponse.

48voto

tloach Points 6590

La réponse à cette question est de vous demander ce que vous êtes vraiment essayer de les protéger? Si quelqu'un a accès à votre base de données, ensuite, ils ont accès à la crypté sels, et ils ont probablement accès à votre code. Avec tout ce qu'ils pouvaient décoder les sels? Si oui, alors le chiffrement est assez inutile de toute façon. Le sel est vraiment là pour faire de sorte qu'il n'est pas possible de former un arc-en-ciel de la table pour le crack de l'ensemble de votre mot de passe de la base de données en une seule fois si elle obtient cassé dans la. De ce point de vue, tant que chaque sel est unique, il n'y a pas de différence, une attaque par force brute qui serait nécessaire avec votre sels ou chiffrées sels pour chaque mot de passe individuel.

3voto

gbarry Points 3813

Ma compréhension de "sel", c'est qu'il fait de la fissuration de plus difficile, mais il ne doit pas tenter de masquer les données supplémentaires. Si vous essayez d'obtenir plus de sécurité en faisant le sel "secret", alors vous avez vraiment veulent juste plus de bits dans vos clés de cryptage.

3voto

Bill the Lizard Points 147311

La deuxième approche est seulement un peu plus sécurisé. Les sels de protéger les utilisateurs contre les attaques par dictionnaire et arc-en-ciel de la table des attaques. Ils rendent plus difficile pour un ambitieux utilisateur malveillant de compromettre votre système entier, mais sont vulnérables à des attaques qui sont axés sur un seul utilisateur de votre système. Si vous utilisez des informations publiquement disponibles, comme un numéro de téléphone, et l'attaquant devient conscient de cela, alors vous avez sauvé une étape dans leur attaque. Bien sûr, la question est sans objet si l'attaquant obtient l'ensemble de votre base de données, de sels et de tous.

EDIT: Après re-lecture au cours de cette réponse et de certains commentaires, il me semble que la confusion peut être dû au fait que je suis le seul à en comparant les deux cas très spécifiques présentées dans la question: au hasard de sel vs non-aléatoire de sel. La question de l'aide d'un numéro de téléphone d'un sel est discutable si l'attaquant obtient l'ensemble de votre base de données, pas de la question de l'utilisation d'un sel.

2voto

Charles Faiga Points 5003

Voici un exemple simple montrant pourquoi il est mauvais d'avoir le même sel pour chaque hachage

Considérons le tableau suivant

UserId  UserName,   Password
     1  Fred	   Hash1 =  Sha(Salt1+Password1)	
     2  Ted	       Hash2 =  Sha(Salt2+Password2)

Cas 1 lors de sel 1 est le même que salt2 Si Hash2 est remplacé par Hash1 puis l'utilisateur 2 peut d'ouverture de session de l'utilisateur 1 mot de passe

Cas 2 lors de sel 1 pas la même salt2 Si Hash2 est remplacé par Hash1 puis user2 peut pas de connexion avec les utilisateurs 1 mot de passe.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X