Exercices Concepts Web & Django Hashage de mots de passe avec Django
🎉

Bravo!

Avancé 🧠 Fondamentaux 30 XP 0 personnes ont réussi

Hashage de mots de passe avec Django

On ne stocke JAMAIS un mot de passe en clair dans une base de données. Si la base est compromise, tous les mots de passe le sont aussi. A la place, on stocke un hash : une empreinte irreversible du mot de passe.

Django fournit des fonctions dans django.contrib.auth.hashers pour gerer ca :

from django.contrib.auth.hashers import make_password, check_password

hash = make_password('mon_mot_de_passe')
# Retourne quelque chose comme 'pbkdf2_sha256$...'

check_password('mon_mot_de_passe', hash) # True
check_password('mauvais_mdp', hash) # False

make_password utilise par défaut PBKDF2 avec SHA256, qui est un algorithme lent expres (pour ralentir les attaques par force brute).

Écris une classe PasswordManager avec :

- hash_password(self, raw_password) : utilise make_password pour hasher le mot de passe. Retourne None si le mot de passe est vide ou None.

- verify_password(self, raw_password, hashed) : utilise check_password pour vérifier. Retourne False si l'un des paramètres est vide ou None.

- is_strong_password(self, password) : vérifie que le mot de passe fait au moins 8 caracteres, contient au moins une majuscule, une minuscule et un chiffre. Retourne un tuple (is_strong, message).

Exemple :

pm = PasswordManager()
h = pm.hash_password('MonMotDePasse123')
pm.verify_password('MonMotDePasse123', h) vaut True
pm.verify_password('mauvais', h) vaut False
pm.is_strong_password('abc') vaut (False, 'Minimum 8 caracteres')

Tests (4/5)

Hash genere
pm = PasswordManager()
h = pm.hash_password('test123')
assert h is not None and h != 'test123'
Vérification correcte
pm = PasswordManager()
h = pm.hash_password('MonMdp123')
assert pm.verify_password('MonMdp123', h) == True
Vérification incorrecte
pm = PasswordManager()
h = pm.hash_password('MonMdp123')
assert pm.verify_password('mauvais', h) == False
Mot de passe fort
pm = PasswordManager()
ok, msg = pm.is_strong_password('MonMdp123')
assert ok == True

+ 0 tests cachés

Indices (3 disponibles)

solution.py