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!
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