Mise à jour: Veuillez noter que je ne demande pas ce qu'est un sel, ce qu'est une table arc-en-ciel, ce qu'est une attaque par dictionnaire ou quel est le but d'un sel. Je demande: si vous connaissez le sel et le hachage des utilisateurs, n'est-il pas assez facile de calculer leur mot de passe?
Je comprends le processus et je le mets moi-même en œuvre dans certains de mes projets.
s = random salt
storedPassword = sha1(password + s)
Dans la base de données que vous stockez:
username | hashed_password | salt
Chaque implémentation de salage que j'ai vue ajoute le sel soit à la fin du mot de passe, soit au début:
hashed_Password = sha1(s + password )
hashed_Password = sha1(password + s)
Par conséquent, une attaque par dictionnaire d'un hacker qui vaut son sel (ha ha) exécuterait simplement chaque mot-clé contre les sels stockés dans les combinaisons courantes énumérées ci-dessus.
Sûrement, la mise en œuvre décrite ci-dessus ajoute simplement une autre étape pour le pirate informatique, sans réellement résoudre le problème sous-jacent? Quelles alternatives existe-t-il pour contourner ce problème, ou est-ce que je comprends mal le problème?
La seule chose que je peux penser à faire est d'avoir un algorithme de mélange secret qui associe le sel et le mot de passe dans un motif aléatoire, ou ajoute d'autres champs utilisateur au processus de hachage, ce qui signifie que le pirate devrait avoir accès à la base de données ET au code pour lacer pour qu’une attaque par dictionnaire se révèle fructueuse. (Mise à jour, comme indiqué dans les commentaires, il est préférable de supposer que le pirate a accès à toutes vos informations, donc ce n'est probablement pas le meilleur).
Permettez-moi de donner un exemple de la façon dont je propose qu'un pirate pirate une base de données utilisateur avec une liste de mots de passe et de hachages:
Données de notre base de données piratée:
RawPassword (not stored) | Hashed | Salt
--------------------------------------------------------
letmein WEFLS... WEFOJFOFO...
Dictionnaire de mots de passe commun:
Common Password
--------------
letmein
12345
...
Pour chaque enregistrement utilisateur, bouclez les mots de passe communs et hachez-les:
for each user in hacked_DB
salt = users_salt
hashed_pw = users_hashed_password
for each common_password
testhash = sha1(common_password + salt)
if testhash = hashed_pw then
//Match! Users password = common_password
//Lets visit the webpage and login now.
end if
next
next
J'espère que cela illustre beaucoup mieux mon propos.
Compte tenu de 10 000 mots de passe courants et de 10 000 enregistrements d'utilisateurs, nous aurions besoin de calculer 100 000 000 de hachages pour découvrir autant de mots de passe d'utilisateurs que possible. Cela peut prendre quelques heures, mais ce n'est pas vraiment un problème.
Mise à jour sur la théorie du craquage
Nous supposerons que nous sommes un hébergeur corrompu, qui a accès à une base de données de hachages et de sels SHA1, avec votre algorithme pour les mélanger. La base de données contient 10 000 enregistrements d'utilisateurs.
Ce site prétend pouvoir calculer 2 300 000 000 de hachages SHA1 par seconde en utilisant le GPU. (Dans la situation du monde réel, ce sera probablement plus lent, mais pour l'instant, nous utiliserons ce chiffre cité).
(((95 ^ 4) / 2300000000) / 2) * 10000 = 177 secondes
Étant donné une gamme complète de 95 caractères ASCII imprimables, avec une longueur maximale de 4 caractères, divisée par le taux de calcul (variable), divisé par 2 (en supposant que le temps moyen pour découvrir le mot de passe nécessitera en moyenne 50% de permutations) pour 10000 utilisateurs, il faudrait 177 secondes pour déterminer tous les mots de passe des utilisateurs dont la longueur est <= 4.
Ajustez un peu pour le réalisme.
(((36 ^ 7) / 1000000000) / 2) * 10000 = 2 jours
En supposant la non-sensibilité à la casse, avec une longueur de mot de passe <= 7, uniquement des caractères alphanumériques, il faudrait 4 jours pour résoudre 10000 enregistrements d'utilisateurs, et j'ai réduit de moitié la vitesse de l'algorithme pour refléter les frais généraux et les circonstances non idéales.
Il est important de reconnaître qu'il s'agit d'une attaque par force brute linéaire, tous les calculs sont indépendants les uns des autres, c'est donc une tâche parfaite pour plusieurs systèmes à résoudre. (IE facile à configurer 2 ordinateurs exécutant une attaque de différentes extrémités qui réduiraient la moitié du temps d'exécution).
Étant donné le cas du hachage récursif d'un mot de passe 1000 fois pour rendre cette tâche plus coûteuse en calcul:
(((36 ^ 7) / 1 000 000 000) / 2) * 1000 secondes = 10,8839117 heures
Cela représente une longueur maximale de 7 caractères alphanumériques, à une vitesse d'exécution inférieure à la moitié de la valeur citée pour un utilisateur .
Le hachage récursif 1 000 fois bloque efficacement une attaque globale, mais les attaques ciblées sur les données des utilisateurs restent vulnérables.