2010-08-25 24 views
14

Quelqu'un pourrait m'aider s'il vous plaît à comprendre comment fonctionne le salage?Mots de passe de salaison 101

Jusqu'à présent, je comprends ce qui suit:

  1. mdp
  2. générer une chaîne aléatoire
  3. Hash le mot de passe et la chaîne aléatoire et concat eux, puis les stocker dans le champ de mot de passe ...

Comment stocke-t-on le sel ou sait-il ce que c'est lorsqu'un utilisateur se connecte? Le stockons-nous dans son propre domaine? Si ce n'est pas le cas, comment l'application peut-elle déterminer ce qu'est le sel? Et si nous le stockons, cela ne va-t-il pas à l'encontre de tout le but?

+0

Trouvé un meilleur 'exact duplicate:' http://stackoverflow.com/questions/420843/ –

Répondre

25

Le sel est combiné avec le mot de passe avant le hachage. le mot de passe et les valeurs d'effacement sont concaténées et la chaîne résultante est hachée. Cela garantit que même si deux personnes avaient le même mot de passe, vous obtiendriez des hachages différents. (rend également les attaques connues sous le nom d'attaques par dictionnaire à l'aide de tables arc-en-ciel beaucoup plus difficiles).

Le sel est ensuite stocké dans le format original/clair avec le résultat du hachage. Plus tard, lorsque vous voudrez vérifier le mot de passe, vous referez le processus d'origine. Combiner le sel de l'enregistrement avec le mot de passe fourni par l'utilisateur, hacher le résultat, comparer le hachage.

Vous le savez probablement déjà. mais c'est important de se souvenir. le sel doit être généré au hasard à chaque fois. Il doit être différent pour chaque hash protégé. Souvent, le RNG est utilisé pour générer le sel.

exemple So..for:
utilisateur-mot de passe: "mypassword"
de sel au hasard: "abcdefg12345"
résultant-texte clair: "mypassword: abcdefg12345" (comment les combiner est à vous aussi longtemps. car vous utilisez le même format de combinaison à chaque fois).
hacher le résultat cleartext: "somestandardlengthhashbasedonalgorithm"

Dans votre base de données maintenant, vous stockez le hachage et le sel utilisés.Je l'ai vu deux façons:

Méthode 1:
field1 - sel = "abcdefg12345"
field2 - password_hash = "somestandardlengthhashbasedonalgorithm"

Méthode 2:
field1 - password_hash = « abcdefg12345: somestandardlengthhashbasedonalgorithm "

Dans les deux cas, vous devez charger le hachage de sel et le mot de passe de votre base de données et refaire le hachage pour la comparaison

+0

Merci pour l'explication approfondie. – Mohamad

11
salt <- random 
hash <- hash(password + salt) 
store hash:salt 

plus tard

input password 
look up hash:salt 
hash(password+salt) 
compare with stored hash 

Got it?

+3

Le but du salage est de vaincre une attaque de dictionnaire. Au lieu de créer un dictionnaire de mots de passe hachés, puis de rechercher simplement des correspondances partout, vous forcez l'attaquant à recalculer tous les hachages pour chaque sel unique. De cette façon, la base de données de mots de passe peut même tomber entre de mauvaises mains, et c'est OK parce que l'adversaire a un problème infaisable à résoudre. – Ian

+0

Ian, est-ce que le sel doit aussi être haché? – Mohamad

+2

@Mel: Puisque le sel est généralement un tas de bits aléatoires, le hachage n'a aucun sens. – jpalecek

1

Si vous utilisez un algorithme de hachage bien connu, quelqu'un pourrait avoir une liste d'un grand nombre de mots de passe possibles déjà hachés en utilisant cet algorithme et comparer les éléments de cette liste avec un mot de passe haché qu'ils veulent craquer (attaque par dictionnaire).
Si vous "salt" tous les mots de passe avant de les hacher, ces dictionnaires sont inutiles, car ils doivent être créés en utilisant votre sel.

3

Comment stockons-nous le sel ou savons-nous ce que c'est lorsqu'un utilisateur se connecte? Le stockons-nous dans son propre domaine?

Oui.

Et si nous le stockons, cela ne va-t-il pas à l'encontre du but recherché?

Non, le but d'un sel est de ne pas secret, mais simplement pour empêcher un attaquant d'amortir le coût de calcul des tables arc-en-sur tous les sites dans le monde (pas de sel) ou tous les utilisateurs de votre site (unique sel utilisé pour tous les utilisateurs).

2

Selon Cryptographie pratique (Neils Ferguson et Bruce Schneier), vous devez utiliser des hachages salés et étirés pour une sécurité maximale.

x[0] := 0 
x[i] := h(x[i-1] || p || s) for i = 1, ..., r 
K := x[r] 

where 
    h is the hash (SHA-1, SHA-256, etc.) 
    K is the generated hashed password 
    p is the plaintext password 
    r is the number of rounds 
    s is the randomly generated salt 
    || is the concatenation operator 

La valeur de sel est un nombre aléatoire qui est stocké avec le mot de passe chiffré. Il n'a pas besoin de rester secret.

L'étirement consiste à effectuer le hachage plusieurs fois pour rendre le calcul plus difficile pour un attaquant afin de tester de nombreuses permutations de mots de passe. r devrait être choisi de sorte que le calcul prend environ 200-1000ms sur l'ordinateur de l'utilisateur. r peut avoir besoin d'être augmenté à mesure que les ordinateurs deviennent plus rapides.