Comment le sel de mot de passe aide-t-il contre une attaque de table arc-en-ciel?

j'ai du mal à comprendre le but d'un salt à un mot de passe. Je crois comprendre que l'usage principal est d'empêcher une attaque de table arc-en-ciel. Cependant, les méthodes que j'ai vu pour mettre en œuvre ceci ne semblent pas vraiment rendre le problème plus difficile.

j'ai vu beaucoup de tutoriels suggérant que le sel soit utilisé comme suit:

$hash =  md5($salt.$password)

le raisonnement étant que le hachage ne correspond plus au mot de passe original, mais à un combinaison du mot de passe et du sel. Mais dites $salt=foo et $password=bar et $hash=3858f62230ac3c915f300c664312c63f . Maintenant quelqu'un avec une table arc-en-ciel pourrait inverser le hachage et venir avec l'entrée "foobar". Ils pourraient alors essayer toutes les combinaisons de mots de passe (f, fo, foo, ... oobar, obar, bar, ar, ar). Il faudra peut-être quelques millisecondes de plus pour obtenir le mot de passe, mais pas grand-chose d'autre.

L'autre utilisation que j'ai vu est sur mon système linux. Dans le fichier/etc / shadow, les mots de passe hashés sont en fait stocké avec le sel. Par exemple, un sel de "foo" et le mot de passe de "bar" hacherait à ceci: $foo$te5SBM.7C25fFDu6bIRbX1 . Si un hacker a pu mettre la main sur ce fichier, je ne vois pas à quoi sert le sel, puisque le hachage inverse de te5SBM.7C25fFDu6bIRbX est connu pour contenir "foo".

Merci pour toute la lumière que n'importe qui peut apporter à ce sujet.

MODIFIER : Merci pour l'aide. Pour résumer ce que je comprends, le sel rend le mot de passe hashé plus complexe, ce qui le rend beaucoup moins susceptible d'exister dans une table arc-en-ciel précalculée. Ce que j'ai mal compris avant, c'est que je supposais qu'une table arc-en-ciel existait pour tous les hash.

197
demandé sur Rich 2009-01-07 18:55:59

10 réponses

Un public de sel pas les attaques par dictionnaire dur à craquer un mot de passe unique. Comme vous l'avez souligné, l'attaquant a accès à la fois au mot de passe hashé et au sel, donc lors de l'exécution de l'attaque du dictionnaire, elle peut simplement utiliser le sel connu en essayant de craquer le mot de passe.

un sel public fait deux choses: il est plus long à déchiffrer une longue liste de mots de passe, et il est impossible d'utiliser une table arc-en-ciel.

pour comprendre le premier, imaginez un seul fichier de mots de passe qui contient des centaines de noms d'utilisateurs et de mots de passe. Sans sel, je pourrais calculer " md5 (attempt[0])", puis parcourir le fichier pour voir si ce hachage apparaît n'importe où. Si des sels sont présents, alors je dois calculer "md5(sel[a] . attemp[0])", comparez avec l'entrée A, puis " md5(salt[b]. attemp[0])", comparez avec l'entrée B, etc. Maintenant, j'ai n fois plus de travail à faire, où n est le nombre de noms d'utilisateur et les mots de passe contenus dans le fichier.

pour comprendre le second, vous devez comprendre ce qu'est une table arc-en-ciel. Une table arc-en-ciel est une grande liste de hash prédéfinis pour les mots de passe couramment utilisés. Imaginez à nouveau le fichier password sans sels. Tout ce que j'ai à faire, c'est parcourir chaque ligne du fichier, sortir le mot de passe hashé, et le chercher dans la table arc-en-ciel. Je n'ai jamais à calculer un hachage unique. Si la recherche est beaucoup plus rapide que la fonction de hachage (ce qui est probablement le cas), cela va considérablement accélérer le craquage du fichier.

mais si le fichier mot de passe est salé, alors la table arc-en-ciel devrait contenir" salt . le mot de passe" pré-haché. Si le sel est suffisamment aléatoire, cela est très peu probable. Je vais probablement avoir des choses comme "hello" et "foobar" et "qwerty" dans ma liste de mots de passe couramment utilisés, pré-hachés( la table arc-en-ciel), mais je ne vais pas avoir des choses comme "jX95psDZhello" ou "LPgB0sdgxfoobar "or" dZVUABJtqwerty " pre-calculated. Cela rendrait la table arc-en-ciel trop grande.

ainsi, le sel réduit l'attaquant de nouveau à un-calcul-par-ligne-par-tentative, qui, lorsqu'il est couplé avec un mot de passe suffisamment long, suffisamment aléatoire, est (en général parler) introuvable.

216
répondu Ross 2015-03-15 17:13:43

les autres réponses ne semblent pas répondre à vos malentendus sur le sujet, alors voici:

deux utilisations différentes du sel

j'ai vu beaucoup de tutoriels suggérant que le sel soit utilisé comme suit:

$hash = md5($salt.$password)

[...]

L'autre utilisation que j'ai vu est sur mon système linux. Dans le fichier/etc / shadow, les mots de passe hashés sont stockés. avec le sel.

vous toujours doit stocker le sel avec le mot de passe, parce que pour valider ce que l'Utilisateur a entré dans votre base de données de mots de passe, vous devez combiner l'entrée avec le sel, hachez-le et comparez-le au hachage stocké.

sécurité du hachage

maintenant quelqu'un avec une table arc-en-ciel pourrait inverser le hachage et venir avec l'entrée "foobar".

[...]

depuis le hachage inversé de te5SBM.7C25fFDu6bIRbX contient "foo".

il n'est pas possible d'inverser le hachage en tant que tel (en théorie du moins). Le hachage de "toto" et le hachage de "saltfoo" ont rien en commun. Changer même un peu dans l'entrée d'une fonction de hachage cryptographique devrait changer complètement la sortie.

cela signifie que vous ne peut pas construire une table arc-en-ciel avec les mots de passe communs et ensuite "mettre à jour" elle avec un peu de sel. Il faut tenir compte du sel dès le début.

C'est la raison pour laquelle vous avez besoin d'une table arc-en-ciel en premier lieu. Parce que vous ne pouvez pas obtenir le mot de passe à partir du hachage, vous précalculez tous les hachages des mots de passe les plus probablement utilisés et comparez ensuite vos hachages avec leurs hachages.

qualité du sel

Mais dites $salt=foo

"foo" serait un extrêmement mauvais choix de sel. Normalement, vous utiliseriez une valeur aléatoire, encodée en ASCII.

en outre, chaque mot de passe a son propre sel, différent (espérons-le) de tous les autres sels sur le système. Cela signifie, que l'attaquant a d'attaquer chaque mot individuellement au lieu d'avoir l'espoir que un les hash correspond à une des valeurs dans sa base de données.

l'attaque

si un hacker pouvait mettre la main sur ce fichier, je ne vois pas à quoi sert le sel,

Un arc-en-ciel de la table d'attaque toujours besoins /etc/passwd (ou quel que soit le mot de passe de la base de données est utilisée), ou d'autre pouvez-vous comparer les valeurs de hachage dans l'arc-en-ciel de table pour les hashs des mots de passe?

comme pour le but: disons que l'attaquant veut construire une table arc-en-ciel pour 100.000 mots anglais couramment utilisés et des mots de passe typiques (pensez"secret"). Sans sel, elle devrait compter 100 000 coups de fouet. Même avec le sel UNIX traditionnel de 2 caractères (chacun est l'un des 64 choix: [a–zA–Z0–9./] ), elle aurait à calculer et stocker 4,096,000,000 hash... tout à fait d'une amélioration.

110
répondu 2009-03-19 14:58:18

l'idée avec le sel est de rendre beaucoup plus difficile à deviner avec la force brute qu'un mot de passe normal basé sur le caractère. Les tables arc-en-ciel sont souvent construites avec un ensemble de caractères spéciaux à l'esprit, et ne comprennent pas toujours toutes combinaisons possibles (bien qu'ils puissent).

donc une bonne valeur de sel serait un entier aléatoire de 128 bits ou plus. C'est ce qui fait échouer les attaques de la table arc-en-ciel. En utilisant une valeur de sel différente pour chaque mot de passe stocké, vous assurez-vous également qu'une table arc-en-ciel construite pour une valeur salt particulière (comme cela pourrait être le cas si vous êtes un système populaire avec une seule valeur salt) ne vous donne pas accès à tous les mots de passe à la fois.

85
répondu Carl Seleborg 2009-03-19 16:06:15

encore une autre grande question, avec beaucoup de réponses très réfléchies -- +1 pour ainsi!

un petit point que je n'ai pas vu mentionné explicitement est que, en ajoutant un sel aléatoire à chaque mot de passe, vous garantissez virtuellement que deux utilisateurs qui se trouve à choisir le même mot de passe produiront des hachures différentes.

Pourquoi est-ce important?

Imaginez la base de données de mots de passe à un grand logiciel société dans le nord-ouest de NOUS. Supposons qu'il contient 30.000 entrées, dont 500 ont le mot de passe bluescreen . Supposons en outre qu'un pirate parvienne à obtenir ce mot de passe, disons en le lisant dans un e-mail de l'utilisateur au département informatique. Si les mots de passe ne sont pas balancés, le hacker peut trouver la valeur hachée dans la base de données, puis simplement pattern-match it pour obtenir l'accès aux autres 499 comptes.

Saler les mots de passe s'assure que chacun des 500 comptes ont un unique (sel+mot de passe), générant un hachage différent pour chacun d'eux, et réduisant ainsi la brèche à un seul compte. Et espérons, contre toute probabilité, que n'importe quel utilisateur assez naïf pour écrire un mot de passe en clair dans un message email n'a pas accès à L'API non documentée pour le prochain OS.

34
répondu Adam Liss 2009-01-10 16:30:37

je cherchais une bonne méthode pour appliquer des sels et j'ai trouvé cet article excelent avec un code d'échantillon:

http://crackstation.net/hashing-security.htm

l'auteur recommande l'utilisation de sels aléatoires par utilisateur, de sorte que l'accès à un sel ne rendra pas la liste entière des hashs aussi facile à déchiffrer.

pour stocker un mot de passe:

  • Generate un long sel aléatoire à L'aide D'un CSPRNG.
  • Ajouter le sel pour le mot de passe et de hachage avec une norme fonction de hachage cryptographique telle que SHA256.
  • enregistrer à la fois le sel et le hachage dans l'enregistrement de la base de données de l'utilisateur.

pour valider un mot de passe:

  • extraire le sel et le hash de l'utilisateur de la base de données.
  • Préprendre le sel à la donnée mot de passe et de hachage en utilisant la même fonction de hachage.
  • comparez le hachage du mot de passe donné avec le hachage de la base de données. Si ils match, le mot de passe est correct. Sinon, le mot de passe est incorrect.
15
répondu MytyMyky 2012-07-14 09:47:30

la raison pour laquelle un sel peut faire échouer une attaque de table arc-en-ciel est que pour les N-bits de sel, la table arc-en-ciel doit être 2^n fois plus grande que la taille de la table sans le sel.

votre exemple d'utilisation de " foo " comme sel pourrait rendre la table arc-en-ciel 16 millions de fois plus grande.

vu L'exemple D'un sel de 128 bits de Carl, cela rend la table 2^128 fois plus grande-maintenant c'est grand - ou autrement dit, combien de temps avant que quelqu'un ait un entrepôt portable qui big?

12
répondu quamrana 2009-01-07 16:11:35

la plupart des méthodes pour briser le cryptage basé sur le hash reposent sur des attaques par la force brute. Une attaque arc-en-ciel est essentiellement une attaque de dictionnaire plus efficace, il est conçu pour utiliser le faible coût de stockage numérique pour permettre la création d'une carte d'un sous-ensemble important de mots de passe possibles à des hachures, et faciliter la cartographie inverse. Ce genre d'attaque, car de nombreux mots de passe ont tendance à être assez court, ou utiliser l'un des quelques modèles de word formats.

tel les attaques sont inefficaces dans le cas où les mots de passe contiennent beaucoup plus de caractères et ne sont pas conformes à des formats basés sur des mots courants. Un utilisateur avec un mot de passe fort pour commencer ne sera pas vulnérable à ce style d'attaque. Malheureusement, beaucoup de gens ne choisissent pas de bons mots de passe. Mais il y a un compromis, vous pouvez améliorer un mot de passe utilisateur en ajoutant aléatoire indésirable. Donc maintenant, au lieu de "hunter2" leur mot de passe pourrait devenir effectivement "hunter2908!fld2R75{R7/; 508PEzoz^U430", qui est beaucoup plus forte le mot de passe. Cependant, parce que vous devez maintenant stocker ce composant de mot de passe supplémentaire, cela réduit l'efficacité du mot de passe composite plus fort. Comme il s'avère, il y a toujours un avantage net à un tel schéma puisque maintenant chaque mot de passe, même les plus faibles, ne sont plus vulnérables à la même table pré-calculée de hachage / arc-en-ciel. Au lieu de cela, chaque entrée de hachage de mot de passe est vulnérable seulement à une table de hachage unique.

dites que vous avez un site qui a une faible force de mot de passe exigence. Si vous n'utilisez pas de sel de mot de passe à tous vos hachages sont vulnérables à des tables de hachage pré-calculé, quelqu'un ayant accès à vos hachages aurait donc accès aux mots de passe pour un grand pourcentage de vos utilisateurs (cependant beaucoup ont utilisé des mots de passe vulnérables, qui serait un pourcentage important). Si vous utilisez un sel de mot de passe constant puis pré-calculé les tables de hash ne sont plus précieux, donc quelqu'un devrait passer le temps de calculer une table de hash personnalisé pour ce sel, ils pourraient le faire mais progressivement, des tables de calcul qui couvrent des permutations de plus en plus grandes de l'espace de problème. Les mots de passe les plus vulnérables (p. ex. les mots de passe simples basés sur des mots de passe, les mots de passe alphanumériques très courts) seraient craqués en quelques heures ou jours, les mots de passe les moins vulnérables seraient craqués après quelques semaines ou mois. Avec le temps, un attaquant accéderait aux mots de passe pour un pourcentage toujours croissant de vos utilisateurs. Si vous utilisez un sel unique pour chaque mot de passe, cela prendrait des jours ou des mois à gagner. l'accès à chacun de ces mots de passe vulnérables.

comme vous pouvez le voir, lorsque vous passer de pas de sel à un sel constant à un sel unique, vous imposez une augmentation de plusieurs ordres de grandeur dans l'effort de casser les mots de passe vulnérables à chaque étape. Sans sel les mots de passe les plus faibles de vos utilisateurs sont trivialement accessibles, avec un sel constant ces mots de passe faibles sont accessibles à un attaquant déterminé, avec un sel unique le coût d'accès aux mots de passe est augmenté tellement élevé que seul l'attaquant le plus déterminé pourrait accéder à un petit sous-ensemble de mots de passe vulnérables, et alors seulement à grands frais.

, Qui est précisément la situation. Vous ne pouvez jamais protéger complètement les utilisateurs contre un mauvais choix de mot de passe, mais vous pouvez augmenter le coût de compromettre les mots de passe de vos utilisateurs à un niveau qui rend la compromission même mot de passe d'un utilisateur prohibitif coûteux.

9
répondu Wedge 2009-01-08 00:21:31

l'un des buts du salage est de battre les tables de hash pré-computées. Si quelqu'un a une liste de millions de hash pré-calculés, ils ne vont pas être en mesure de chercher $1$foo$te5SBM.7C25fFDu6bIRbX1 dans leur table même s'ils connaissent le hash et le sel. Ils auront toujours à la force brute.

un autre but, comme Carl s le mentionne, est de rendre brute forçant une liste de coups de fouet plus cher. cents cinquante et une million neuf cent dix mille neuf cent vingt"

tous les deux ces objectifs sont toujours atteints même si les sels sont publics.

3
répondu recursive 2009-01-07 16:06:02

autant que je sache, le sel est destiné à rendre les attaques dictionnaires plus difficiles.

c'est un fait connu que beaucoup de gens vont utiliser des mots communs pour les mots de passe au lieu de chaînes apparemment aléatoires.

ainsi, un hacker pourrait utiliser ceci à son avantage au lieu d'utiliser juste la force brute. Il ne cherchera pas les mots de passe comme aaa, aab, aac... mais au lieu d'utiliser des mots et des mots de passe communs (comme le seigneur des anneaux noms! ;))

donc si mon le mot de passe est Legolas un hacker pourrait essayer cela et le deviner avec un "quelques" essais. Cependant, si nous salons le mot de passe et il devient fooLegolas le hachage sera différent, de sorte que l'attaque de dictionnaire sera infructueux.

Espère que ça aide!

1
répondu rgargente 2009-01-07 16:06:38

je suppose que vous utilisez la fonction PHP --- md5 (), et $ preceded variables --- alors, vous pouvez essayer de chercher cet article Shadow Password HOWTO spécialement le paragraphe 11.

aussi, vous avez peur d'utiliser des algorithmes de digestion de messages, Vous pouvez essayer des algorithmes de chiffrement réels, tels que ceux fournis par le module mcrypt , ou des algorithmes de digestion de messages plus forts, tels que ceux qui fournissent le mhash module (sha1, sha256, et autres).

je pense que l'algorithme de digestion de message plus fort est un must. On sait que MD5 et SHA1 ont des problèmes de collision.

-2
répondu daniel 2009-01-07 16:26:09