2010-11-11 4 views
1

Je sais qu'il ya des tonnes de blogs, des articles et des questions sur les mots de passe SO sur le salage, mais une chose que je n'ai pas été en mesure de trouver une réponse à ceci:Une autre question sur les mots de passe Salage

Si je suis générer un hachage de mot de passe comme ceci:

$salt = randomString 
$password = $_POST['password'] 
hashedPassword = sha1($password.$salt) 

et moi avons une table comme ceci:

Users 
user_id | hashedPassword | salt 

Pourquoi est-il si difficile pour un attaquant de comprendre ce mot de passe sur? Ne peuvent-ils pas simplement utiliser une table arc-en-ciel, ou une force brute pour comprendre le sel, et puis ajouter le sel à chaque mot dans une attaque de dictionnaire?

+0

Ok donc, en gros, un attaquant pourrait toujours obtenir le mot de passe d'un utilisateur individuel s'il a passé un temps fou à le faire, mais il devra passer la même merde à chaque mot de passe. Est-ce que je comprends bien? – Catfish

Répondre

5

Ils ne peuvent pas simplement utiliser une table arc-en- ou la force brute pour comprendre le sel,

Comment ça marcherait? Mais c'est un non-problème de toute façon - supposons que l'attaquant sait le sel. Son but n'est pas d'être secret, c'est pourquoi vous le stockez juste à côté du hachage.

puis d'ajouter le sel à chaque mot dans une attaque par dictionnaire?

Bien sûr, ils peuvent le faire, mais ils doivent le faire pour cet utilisateur particulier. Ils ne peuvent pas amortir l'effort sur tous les utilisateurs dans la base de données, ou utiliser une table précalculée de hash-> Mappages de mot de passe.

Cela, et seulement cela est le point d'un sel.

3

Ils peuvent le faire. Le pouvoir est qu'ils devraient donc générer une nouvelle table arc-en-ciel pour chaque mot de passe (ou parcourir chaque entrée de dictionnaire pour chaque mot de passe). Le temps total de calcul pour un seul mot de passe est donc toujours le même que pour un sel commun. Mais le temps de calcul total pour les mots de passe multiples augmente de façon exponentielle ...

Oh, et il est généralement considéré comme une bonne pratique d'avoir deux sels. Un stocké dans la base de données est unique par mot de passe, et un stocké sur le système de fichiers unique pour l'ensemble du site. De cette façon, si la base de données est compromise, il n'y a pas d'inquiétude significative car ils n'ont que la moitié des sels utilisés. Bien sûr, si compromis qu'ils pouvaient obtenir tout, ce système de fichiers, mais en cas de compromission de système de fichiers, ils peuvent installer un mot de passe et d'autres renifleurs ... nasties

J'espère que ça aide ...

+3

Chaque fois que vous abusez du mot "exponentiellement", Dieu tue un chaton. S'il te plaît, pense aux chatons. –

2

Eh bien, pour qu'ils ne peuvent pas utiliser une table arc-en-ciel précalculée pour trouver une collision - un attaquant devrait générer sa propre table arc-en-ciel en utilisant le sel. En outre, en supposant que chaque utilisateur a un sel différent, cette table arc-en-ciel ne fonctionnerait que pour un seul utilisateur - rendant leur travail beaucoup plus difficile.

3

Le but du sel n'est pas de rendre un seul mot de passe plus fort. Il s'agit d'empêcher l'attaquant de passer à l'échelle, en attaquant plusieurs mots de passe. Avec le sel, l'attaquant ne peut pas réutiliser ses efforts pour attaquer un autre mot de passe; il doit ressasser son dictionnaire.

Les tableaux arc-en-ciel n'ont rien de magique; ils sont juste un cas particulier d'une table précalculée, qui s'apparente à une simple attaque de dictionnaire avec des modalités spatio-temporelles légèrement distinctes. Construire la table arc-en-ciel implique plus ou moins de passer par le dictionnaire complet. Les tables précalculées sont un gain pour l'attaquant s'il peut les utiliser pour attaquer plusieurs mots de passe. Si les mots de passe sont salés, les tables précalculées, arc-en-ciel ou non, ne lui rapporteront rien. Cela étant dit, un seul mot de passe est souvent faible et peut être brutalement forcé, parce que le mot de passe moyen rentrera dans le cerveau moyen de l'utilisateur, et, en tant que tel, ne peut pas être très complexe. Pour atténuer ce risque, il faut utiliser un hachage répété ou itéré. Un sel n'aide pas ici (mais il ne nuit pas non plus). Voir this answer pour plus de détails.

1

Prenons un exemple simple: nous avons deux bases de données, Alpha et Beta:

Alpha hash juste le mot de passe et stocke le résultat:

row: { 
    passwordHash = Hash(password) 
} 

Beta crée une valeur aléatoire pour chaque utilisateur et l'utilise comme partie de l'entrée de la fonction de hachage:

row: { 
    salt = RandomString(), 
    passwordHash = Hash(password + salt) 
} 

Maintenant dire que votre adversaire a une connaissance préalable que certains de vos utilisateurs utilisent le mot de passe: "password"

Pour trouver tous les utilisateurs Alpha dont le mot de passe est "password", il suffit de calculer le hachage de "password" une fois . Voici un exemple de SQL:

DECLARE @Hash INT; SET @Hash = Hash("password"); 
SELECT UserID FROM Users WHERE passwordHash = @Hash 

Comme il implique que l'égalité entière, il est à peu près aussi efficace qu'une requête peut être. Même si Alpha avait des centaines de milliers d'utilisateurs, il reviendrait très rapidement. Le fait que Beta hashes incluent une valeur aléatoire spécifique à la ligne dans chaque hachage de mot de passe, vous ne pouvez pas écrire une requête similaire efficace pour cela. Le plus proche que vous pourriez obtenir serait de réévaluer le (intentionnellement coûteux à calculer) fonction de hachage pour salt de chaque ligne:

SELECT u.UserID FROM Users u WHERE u.passwordHash = Hash("password" + u.salt) 

Le fait que la recherche d'un mot de passe connu est si cher devrait indiquer combien il coûte cher est d'effectuer une attaque en force brute, même si cette attaque est guidée par des dictionnaires de mots de passe communs, ou des algorithmes qui tentent de mélanger des mots et des nombres pour créer des mots de passe comme le font les humains.


Vous savez déjà que salt est une mesure de se défendre contre les attaques « de table » arc-en-, votre question est ... comment? "Table arc-en-ciel" est devenu un terme fleuri pour toute attaque qui calcule les hachages pour les mots de passe potentiels communs et potentiels à l'avance et les stocke dans une table de recherche efficace. Une fois que vous avez construit cette table (ce qui peut prendre plusieurs heures), vous devez ensuite parcourir chaque utilisateur et voir si son mot de passe est dans la table de recherche. Si c'est le cas, vous aurez deviné le mot de passe de cet utilisateur.

Les utilisateurs de Alpha sont en effet vulnérables à ce type d'attaque. Alpha aura des hachages équivalents pour des mots de passe équivalents, donc une table de hachage ou une table arc-en-ciel pourrait être utilisée pour inverser les hachages. Mais Beta contourne habilement cette vulnérabilité en rendant le résultat de la fonction de hachage unique à l'utilisateur en vertu du salt. J'espère que cela aide un lecteur, un jour!