12
votes

Sel, mots de passe et sécurité

J'ai lu plusieurs des questions à ce sujet, mais de nombreuses réponses se contredisent mutuellement ou je ne comprends pas.

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?


6 Réponses :


3
votes

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.


4 commentaires

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.



2
votes

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): xxx

$ user_salt est le sel de la base de données unique à chaque utilisateur, $ static_salt est le sel spécifié dans les paramètres de votre code quelque part.


3 commentaires

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.



1
votes

Si vous ne stockez pas le sel, comment vérifierez-vous si le mot de passe correct a été fourni?


2 commentaires

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.




26
votes

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.

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 hash = md5 (mot de passe) et hachage = SHA1 (mot de passe) sont courants.

Cependant, ils peuvent être générés pour toute fonction de hachage pouvant être décrite comme sortie = f (entrée) . Si vous utilisez un sel à l'échelle du site pour tous les mots de passe utilisateur, par exemple hash = md5 (sel + mot de passe) , vous pouvez construire une fonction f , f ( Mot de passe) = MD5 (sel + mot de passe) . 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.

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.

Il y a plusieurs façons de faire cela. Moyens populaires incluent:

  • Un sel séparé pour chaque utilisateur, stocké à côté de leurs autres détails de la base de données: hachage = hachage (sel + mot de passe)
  • Un sel global et une valeur unique par utilisateur: hachage = hashfunction (sel + mot de passe + user_id) Par exemple
  • Un sel global et un sel par utilisateur: hash = hashfunction (global_salt + user_salt + mot de passe)

    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.

    enfin, pour répondre à votre question actuelle:

    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:

    • Tables arc-en-ciel
    • hachage mots de passe communs ( 123 , mot de passe , dieu ) et voyant s'il existe dans la base de données, puis compromettre ces comptes
    • Recherchez des hayes identiques dans la base de données, ce qui signifie des mots de passe identiques (probablement)

3 commentaires

Par "un hachage global et un hachage par utilisateur" Vous voulez dire "un sel global et un par utilisateur sel ", 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.



2
votes

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é.

  1. Pourquoi le sel?
  2. Pourquoi le sel est stocké avec le hachage de (mot de passe + sel).

    Voici ma compréhension.

    1. Les pirates informatiques ont une table arc-en-ciel pour tous les mots de dictionnaire qu'il a faits avec de grands efforts. Chaque table d'arc-en-ciel est en train de sortir du pirate informatique. Dans des mots simples, c'est très dur.
    2. Comme selon le point 1, si nous faisons que le pirate informatique calcule la table arc-en-ciel pour chaque utilisateur, il deviendra l'âge au moment où il connaît le mot de passe. Et si l'utilisateur change fréquemment le mot de passe, alors même les grands enfants de Hacker auront vieilli au moment où ils connaissent le mot de passe.
    3. OK. Alors utilisez un sel différent pour chaque utilisateur. Cela rend le pirate informer une attaque séparée pour connaître le mot de passe de chaque utilisateur.
    4. Je vois que divers lecteurs ont souligné que, au lieu de frapper la tête sur chaque utilisateur, un grand pirate informatique mettra tous ses efforts sur le compte d'administration, puis il est fait :). Donc, dans ce cas, nous allons passer une longueur d'avance, puis utiliser une méthode différente pour calculer le hachage. Disons que le sel n'est pas exactement ce qui est stocké. C'est peut-être la moitié du hachage réel. L'autre moitié est stockée ailleurs d'une autre manière (calculée d'une autre manière). Ceci est juste une mesure de sécurité supplémentaire. Et nous connaissons THWT dans les temps actuels, le pouvoir de calcul des ordinateurs augmente. Donc, les personnes éthiques savent que le plus haut ordinateur des mondes prendra 1 an pour craquer le mot de passe administrateur (juste un exemple). Ils forcent donc une politique qui dit changer le mot de passe administrateur tous les 3 mois. Au moment où Hacker connaît l'ancien mot de passe, le nouveau est en vigueur. Ou dire que la base de données est compromise, les bons gars enront-ils en savoir que le pirate informatique fissure le mot de passe. Et les bons gars changent les choses d'ici là (souvenez-vous que la mise à niveau d'Alogorithms ..sha1 Sha2 et maintenant SHA3) .....

      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.

      Prends soin de toi ....


0 commentaires