Sel Non aléatoire pour les hachures de mot de passe

mise à jour: j'ai récemment appris de cette question que dans toute la discussion ci-dessous, moi (et je suis sûr que d'autres l'ont fait aussi) était un peu confus: ce que j'appelle une table arc-en-ciel, est en fait appelé une table de hachage. Les tables arc-en-ciel sont des créatures plus complexes, et sont en fait une variante des chaînes de Hash Hellman. Bien que je crois que la réponse est toujours la même (puisqu'il ne descend pas à la cryptanalyse), une partie de la discussion pourrait être un peu faussé.

La question: " Qu'est-ce que les tables arc-en-ciel et comment sont-elles utilisées? "


typiquement, je recommande toujours l'utilisation d'une valeur aléatoire cryptographique forte comme sel, à utiliser avec des fonctions de hachage (par exemple pour les mots de passe), comme protéger contre les attaques de table arc-en-ciel.

mais est-il réellement nécessaire cryptographiquement pour le sel d'être aléatoire? Serait une valeur unique (unique par utilisateur, par exemple userId) suffisant à cet égard? Cela empêcherait en fait d'utiliser une seule Table arc-en-ciel pour casser tous (ou la plupart) les mots de passe dans le système...

Mais le manque d'entropie vraiment affaiblir la robustesse cryptographique des fonctions de hachage?


Note, Je ne demande pas pourquoi utiliser le sel, comment le protéger (il n'est pas nécessaire qu'il le soit), en utilisant un seul hachage constant (ne le soit pas), ou quel type de fonction de hachage utiliser.

Que le sel ait besoin d'entropie ou non.


Merci pour les réponses jusqu'à présent, mais je voudrais me concentrer sur les domaines que je suis (un peu) moins familier avec. Principalement implications pour la cryptanalyse-j'apprécierais le plus si quelqu'un a une certaine entrée de la crypto-mathématique PoV.

De plus, s'il y a d'autres vecteurs qui n'ont pas été pris en compte, c'est aussi un excellent apport (voir @Dave Sherohman point sur les systèmes multiples).

Au - delà de cela, si vous avez une théorie, une idée ou une meilleure pratique-s'il vous plaît, soutenez ceci avec une preuve, un scénario d'attaque, ou des preuves empiriques. Ou même des considérations valables pour des compromis acceptables... Je suis familier avec la meilleure pratique (capital B capital P) sur le sujet, je voudrais prouver quelle valeur cela fournit réellement.


EDIT: quelques très bonnes réponses ici, mais je pense que comme @Dave dit, il s'agit de tables arc-en-ciel pour les utilisateurs communs nom... et peut-être aussi des noms moins communs. Cependant, que faire si mes noms d'utilisateur sont globalement uniques? Pas nécessairement unique pour mon système, mais pour chaque utilisateur-par exemple adresse e-mail.

Il n'y aurait aucune incitation à construire un RT pour un seul utilisateur (comme @Dave l'a souligné, le sel n'est pas gardé secret), et cela empêcherait tout de même le regroupement. Le seul problème serait que je pourrais avoir le même email et mot de passe sur un site différent - mais salt ne serait pas empêcher cela de toute façon.

Donc, il revient à la cryptanalyse EST l'entropie nécessaire, ou pas? (Ma pensée est qu'il n'est pas nécessaire à partir d'une cryptanalyse point de vue, mais il est d'autres raisons pratiques.)

84
demandé sur Luke Girvin 2009-02-11 15:33:10

9 réponses

Le sel

est traditionnellement stocké comme préfixe du mot de passe. Cela le fait déjà connaître à tout attaquant ayant accès au hachage de mot de passe. L'utilisation du nom d'utilisateur comme sel ou non n'affecte pas ces connaissances et, par conséquent, n'aurait aucun effet sur la sécurité d'un seul système.

cependant, l'utilisation du nom d'utilisateur ou de toute autre valeur contrôlée par l'utilisateur comme sel réduirait la sécurité entre les systèmes, en tant qu'utilisateur ayant le même nom d'utilisateur et mot de passe sur plusieurs systèmes qui utilisent le même algorithme de hachage de mot de passe finirait avec le même hachage de mot de passe sur chacun de ces systèmes. Je ne considère pas qu'il s'agit d'une responsabilité importante parce que, en tant qu'attaquant, je tenterais d'abord les mots de passe qu'un compte cible est connu pour avoir utilisé sur d'autres systèmes avant de tenter tout autre moyen de compromettre le compte. Des hachages identiques ne feraient que me dire à l'avance que le mot de passe connu fonctionnerait, ils ne rendraient pas l'attaque réelle plus facile. (Notez, cependant, qu'un une comparaison rapide des bases de données des comptes fournirait une liste de cibles prioritaires, car elle me dirait qui est et qui ne réutilise pas les mots de passe.)

le plus grand danger de cette idée est que les noms d'utilisateur sont généralement réutilisés - à peu près n'importe quel site que vous voulez visiter aura un compte d'utilisateur nommé "Dave", par exemple, et "admin" ou "root" sont encore plus communs - ce qui rendrait la construction de tables arc-en-ciel ciblant les utilisateurs avec ces noms communs beaucoup plus facile et plus efficace.

ces deux défauts pourraient être résolus efficacement en ajoutant une deuxième valeur de sel (soit fixe et caché ou exposé comme sel standard) au mot de passe avant de le Hasher, mais, à ce point, vous pouvez aussi bien utiliser le sel entropique standard de toute façon au lieu de travailler le nom d'utilisateur dans elle.

Édité pour Ajouter: beaucoup de gens parlent de l'entropie et si l'entropie de sel est important. Il est, mais pas pour la raison la plupart des commentaires sur elle semblent penser.

La pensée générale semble être que l'entropie est important de sorte que le sel sera difficile pour un attaquant de deviner. Ceci est incorrect et, en fait, complètement hors de propos. Comme a été souligné à quelques reprises par diverses personnes, les attaques qui seront touchés par le sel ne peut être faite par quelqu'un avec la base de données de mot de passe et quelqu'un avec la base de données de mot de passe peut juste regarder pour voir ce que chaque compte est le sel est. Que ce soit facile à deviner ou pas, peu importe quand on peut y jeter un coup d'oeil.

la raison pour laquelle l'entropie est importante est d'éviter le regroupement des valeurs salines. Si le sel est basé sur le nom d'utilisateur et que vous savez que la plupart des systèmes ont un compte nommé "root" ou "admin", alors vous pouvez faire une table arc-en-ciel pour ces deux sels et il craquera la plupart des systèmes. Si, par contre, un sel aléatoire de 16 bits est utilisé et que les valeurs aléatoires sont à peu près égales distribution, puis vous avez besoin d'une table arc-en-ciel pour tous les 2^16 sels possibles.

il ne s'agit pas d'empêcher l'attaquant de savoir ce qu'est le sel d'un compte individuel, il s'agit de ne pas leur donner la grosse cible d'un seul sel qui sera utilisé sur une proportion substantielle de cibles potentielles.

151
répondu Dave Sherohman 2009-02-11 23:06:34

L'utilisation d'un sel à haute entropie est absolument nécessaire pour stocker les mots de passe en toute sécurité.

Prenez mon nom d'utilisateur ' gs 'et ajoutez-le à mon mot de passe' MyPassword ' donne gsMyPassword. Ceci est facilement brisé en utilisant une table arc-en-ciel parce que si le nom d'utilisateur n'a pas assez d'entropie, il se peut que cette valeur soit déjà stockée dans la table arc-en-ciel, surtout si le nom d'utilisateur est court.

un Autre problème sont les attaques où vous savez qu'un utilisateur participe à deux ou plus de services. Il y a beaucoup de noms d'utilisateurs communs, probablement les plus importants sont admin et root. Si quelqu'un crée une table arc-en-ciel qui a des sels avec les noms d'utilisateurs les plus communs, il pourrait les utiliser pour compromettre des comptes.

ils avaient un sel 12 bits . 12 bits 4096 combinaisons différentes. Ce n'était pas assez sûr, parce que que beaucoup d'informations peuvent être facilement stockées aujourd'hui . Il en va de même pour les 4096 noms d'utilisateurs les plus utilisés. Il est probable que quelques-uns de vos utilisateurs choisiront un nom d'utilisateur qui appartient aux noms d'utilisateur les plus courants.

j'ai trouvé ce password checker qui calcule l'entropie de votre mot de passe. Avoir une entropie plus petite dans les mots de passe (comme en utilisant des noms d'utilisateur) rend beaucoup plus facile pour rainbowtables comme ils essaient de couvrir au moins tous les mots de passe avec une entropie faible, parce qu'ils sont plus susceptible de se produire.

29
répondu Georg Schölly 2009-02-19 20:27:14

il est vrai que le nom d'utilisateur seul peut être problématique puisque les gens peuvent partager des noms d'utilisateur entre différents sites web. Mais il devrait être plutôt un problème si les utilisateurs avaient un nom différent sur chaque site. Alors pourquoi ne pas simplement le rendre unique sur chaque site web. Hachez le mot de passe un peu comme ceci

hashfunction("www.yourpage.com/"+nom d'utilisateur+" / "+mot de passe)

cela devrait résoudre le problème. Je ne suis pas un maître de la cryptanalyse, mais je doute que le fait que nous n'utilisons pas de haute entropie rendrait le hachage affaiblie.

8
répondu konne 2010-10-26 17:18:18

j'aime utiliser à la fois: un sel aléatoire de haute entropie par enregistrement, plus L'ID unique de l'enregistrement lui-même.

Si ce n'est pas ajouter beaucoup à la sécurité contre les attaques par dictionnaire, etc., il ne supprime le cas fringe où quelqu'un Copie leur sel et hash à un autre enregistrement avec l'intention de remplacer le mot de passe avec leur propre.

(il est certes difficile de penser à une circonstance où cela s'applique, mais je ne peux voir aucun mal dans les ceintures et accolades quand il s'agit de la sécurité.)

7
répondu teedyay 2009-02-11 13:34:18

Si le sel est connu ou facilement deviner, vous n'avez pas augmenté la difficulté d'une attaque par dictionnaire. Il est même possible de créer une table arc-en-ciel modifiée qui prend en compte un sel "constant".

L'utilisation de sels uniques augmente la difficulté des attaques de dictionnaires en vrac.

ayant une valeur unique, cryptographiquement forte de sel serait idéal.

3
répondu HUAGHAGUAH 2009-02-11 13:21:57

je dirais que tant que le sel est différent pour chaque mot de passe, vous serez probablement ok. Le point du sel, est de sorte que vous ne pouvez pas utiliser la table arc-en-ciel standard pour résoudre chaque mot de passe dans la base de données. Donc, si vous appliquez un sel différent à chaque mot de passe (même si ce n'est pas aléatoire), l'attaquant devrait essentiellement calculer une nouvelle table arc-en-ciel pour chaque mot de passe, puisque chaque mot de passe utilise un sel différent.

L'utilisation d'un sel avec plus d'entropie ne aide beaucoup, parce que le pirate dans ce cas, est supposé avoir déjà la base de données. Puisque vous devez être en mesure de recréer le hash, vous devez déjà savoir ce qu'est le sel. Donc, vous devez stocker le sel, ou les valeurs qui composent le sel dans votre dossier de toute façon. Dans des systèmes comme Linux, la méthode pour obtenir le sel est connue, donc il n'y a pas d'utilité d'avoir un sel secret. Vous devez supposer que l'attaquant qui a vos valeurs de hachage, ne sait probablement votre sel de valeurs.

3
répondu Kibbee 2009-02-11 13:51:40

La force d'une fonction de hachage n'est pas déterminée par son entrée!

L'utilisation d'un sel qui est connu de l'attaquant rend évidemment la construction d'une table arc-en-ciel (en particulier pour les noms d'utilisateur codés comme root ) plus attrayant, mais il n'affaiblit pas le hash . L'utilisation d'un sel inconnu de l'attaquant rendra le système plus difficile à attaquer.

La concaténation d'un nom d'utilisateur et mot de passe pourrait encore fournir une entrée pour une table arc-en-ciel intelligente, donc en utilisant un sel d'une série de caractères pseudo-aléatoires, stockés avec le mot de passe hachée est probablement une meilleure idée. À titre d'exemple, si j'avais le nom d'utilisateur " potato "et le mot de passe" beer", l'entrée concaténée pour votre hash est" potatobeer", qui est une entrée raisonnable pour une table arc-en-ciel.

changer le sel chaque fois que l'utilisateur change son mot de passe pourrait aider à vaincre les attaques prolongées, comme le ferait le application d'une politique de mot de passe raisonnable, par exemple cas mixte, ponctuation, min Longueur, changer après n semaines.

cependant, je dirais que votre choix de l'algorithme digest est plus important. L'utilisation de SHA-512 va s'avérer plus pénible pour quelqu'un qui génère une table arc-en-ciel que MD5, par exemple.

3
répondu David Grant 2009-02-11 14:58:56
Le sel

doit avoir le plus d'entropie possible pour s'assurer que si une valeur d'entrée donnée est hachée plusieurs fois, la valeur de hachage résultante sera, aussi proche que possible, toujours différente.

L'utilisation de valeurs de sel toujours changeantes avec autant d'entropie que possible dans le sel assurera que la probabilité de hachage (par exemple, mot de passe + sel) produira des valeurs de hachage entièrement différentes.

moins d'entropie dans le sel, plus de chance vous avez de la génération de la même valeur salt, donc plus vous aurez de chance de générer la même valeur de hachage.

Il est de la nature de la valeur de hachage d'être "constante" lorsque l'entrée est connu "et " constant" qui permettent à des attaques par dictionnaire ou rainbow tables pour être efficace. En faisant varier la valeur de hachage résultante autant que possible (en utilisant des valeurs de sel d'entropie élevées) assure que le hachage de la même entrée+sel aléatoire produira de nombreux résultats de valeur de hachage différents, de ce fait vaincre (ou du moins réduire considérablement l'efficacité) les attaques de table arc-en-ciel.

1
répondu CraigTP 2009-02-11 13:06:36

entropie est le point de la valeur du sel.

S'il est simple et reproductible "mathématiques" derrière sel, que c'est le même que le sel n'est pas là. Ajouter de la valeur dans le temps devrait suffire.

-1
répondu dmajkic 2009-02-11 12:40:59