Ajout d'un sel à .htpasswd?
-
09-10-2019 - |
Question
Est-il possible d'ajouter un sel aux mots de passe dans les fichiers .hpasswd? Je suppose que non puisque le serveur aurait besoin du sel pour chaque utilisateur afin de vérifier le mot de passe et je ne peux pas penser à la façon dont il les obtenir, mais sinon si la liste devait être obtenue, il serait assez vulnérable. Y at-il une solution?
Merci pour votre aide, Ben
La solution
Par défaut htpasswd utilise la fonction standard crypte et donc les mots de passe sont déjà salés - note dans cet exemple que les utilisateurs ont le même mot de passe mais les hash sont différentes:
simon@diablo:~$ htpasswd -b -c htpasswd simon abcd Adding password for user simon simon@diablo:~$ htpasswd -b htpasswd simon2 abcd Adding password for user simon2 simon@diablo:~$ cat htpasswd simon:NWvm/LCCxQ64E simon2:2I.LBzsRqULN6
(note: le drapeau -b
est normalement découragé parce que d'autres utilisateurs peuvent voir vos arguments de ligne de commande et donc le mot de passe)
Les deux premiers caractères de la valeur de hachage sont le sel; les mots de passe sont vérifiés en appelant crypt()
à nouveau. Saisie du mot de passe erroné produit une chaîne qui est inégale au mot de passe haché:
>>> from crypt import crypt
>>> crypt("wrongpass", "NWvm/LCCxQ64E")
'NWbxQgX1unvso'
alors que le mot de passe correct produit le hachage attendu:
>>> crypt("abcd", "NWvm/LCCxQ64E")
'NWvm/LCCxQ64E'
htpasswd -m
utilise un algorithme différent qui est basé MD5 et utilise un sel plus:
simon@diablo:~$ htpasswd -m -b -c htpasswd simon abcd Adding password for user simon simon@diablo:~$ cat htpasswd simon:$apr1$mfvnBVmG$iIHIHOaH9vcImG5G.8eVa/
Ici, le sel est le 8 caractères entre la deuxième et la troisième $
.
htpasswd -s
stocke un SHA-1 digèrent sans sel; Cela semble être la compatibilité avec Netscape / LDIF:
simon@diablo:~$ htpasswd -s -b -c htpasswd simon abcd Adding password for user simon simon@diablo:~$ htpasswd -s -b htpasswd simon2 abcd Adding password for user simon2 simon@diablo:~$ cat htpasswd simon:{SHA}gf6L/odXbD7LIkJvjleEc4KRes8= simon2:{SHA}gf6L/odXbD7LIkJvjleEc4KRes8=
Ceux-ci peuvent facilement être inversées - convertir en un condensé hexagonal:
>>> "".join("%02x" % ord(c)
... for c in "gf6L/odXbD7LIkJvjleEc4KRes8=".decode("base64"))
'81fe8bfe87576c3ecb22426f8e57847382917acf'
puis utilisez base de données de hachage en ligne .
Autres conseils
L'utilitaire htpasswd
fait déjà des sels d'utilisation dans la plupart des cas:
La crypte () et les formats MD5 permutent la représentation par préfixer une chaîne de sel aléatoire, pour faire du dictionnaire des attaques contre les mots de passe plus difficile.
Et c'est (un peu) dans le but de sels dans les fichiers de mot de passe. Bien que les sels doivent être inclus dans le fichier .htpasswd
du serveur pour le serveur pour pouvoir vérifier les mots de passe, ce sont les nombreuses possibilités différentes de ce qu'un sel pourrait être que défend contre de telles techniques d'attaque comme tables arc-en-.
Cependant, si vos utilisateurs choisissent des mots de passe faibles ou communs, la fissuration par mot de passe est un problème de toute façon, puisque l'attaquant (présumé avoir accès au fichier de mot de passe) va essayer ceux d'abord, très rapidement, en fait (non limité par la vitesse de le serveur et une connexion Internet), en essayant de deviner la façon normale. Le meilleur conseil que je peux donner est que les utilisateurs doivent toujours choisir des mots de passe.