Package crypt Python: peut taper des caractères supplémentaires dans le mot de passe

J’utilise le package crypt de Python pour conserver les mots de passe cryptés dans une firebase database MySQL pour un site Web Django. Je ne suis pas sûr que ce soit un bogue, mais voici le code que j’utilise:

Pour chiffrer / persister le mot de passe:

user.password = crypt(request.POST['password'], netid) user.save() 

Pour rechercher un mot de passe correct lors de la connexion:

 if crypt(password, email) == user.password: # Grant acccess to the user's profile, etc. 

Le problème est le suivant. Si je crypte un mot de passe avec la variable netid = [email protected] et request.POST['password'] = 'ABC123abc' , cela fonctionne request.POST['password'] = 'ABC123abc' . Cependant, lorsque j’essaie de me connecter, si j’utilise le mot 'ABC123abc[trailing_chars]' passe 'ABC123abc[trailing_chars]' , où trailing_chars peut être n’importe quelle chaîne valide, je peux toujours me connecter. Pourquoi? Il se pose comme un grand trou de sécurité tel quel.

Tout d’abord, vous ne devriez pas utiliser une adresse e-mail comme sel (le second argument) pour crypt. Ce n’est pas sécurisé Vous DEVEZ choisir un bon sel au hasard.

Pour les cryptes traditionnelles, le sel est une chaîne de deux caractères choisie dans l’ensemble [a–zA–Z0–9./] . Cette version de crypt accepte seulement 8 caractères d’entrée et supprime tous les caractères suivants de l’entrée après le 8. C’est ce que vous voyez ici.

Les mises en œuvre de cryptes modernes prennent également en charge d’autres algorithmes qui sont cryptographiquement beaucoup plus puissants que les cryptes traditionnelles, mais ils ne sont pas disponibles sur toutes les plates-formes. Les nouveaux algorithmes ne limitent pas non plus l’entrée à 8 caractères.

Pour utiliser l’un de ces meilleurs algorithmes (si vous utilisez une plate-forme qui les prend en charge), vous devez fournir un sel dans un format spécial. C’est ainsi que la fonction reconnaît que vous souhaitez utiliser un autre algorithme.

Pour les algorithmes supplémentaires pris en charge par glibc (et donc disponibles sur GNU / Linux), consultez la section “Notes Glibc” de la page de manuel crypt .

Par ailleurs, lors de la vérification du mot de passe, vous n’avez pas besoin d’extraire manuellement le sel. Le mot de passe crypté commence déjà par le sel, il vous suffit donc de transmettre user.password (et non le email ) comme deuxième argument à crypt . Cela fonctionne si vous utilisez l’ancien algorithme ou l’un des nouveaux. Le choix de l’algorithme et la génération d’un sel au format correct ne doivent être effectués que lors du cryptage du mot de passe, et non lors de la vérification.