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$...'
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).
import django
from django.conf import settings
if not settings.configured:
settings.configure(
DATABASES={},
INSTALLED_APPS=['django.contrib.contenttypes'],
DEFAULT_AUTO_FIELD='django.db.models.BigAutoField',
)
django.setup()
from django.contrib.auth.hashers import make_password, check_password
class PasswordManager:
def hash_password(self, raw_password):
if not raw_password:
return None
return make_password(raw_password)
def verify_password(self, raw_password, hashed):
if not raw_password or not hashed:
return False
return check_password(raw_password, hashed)
def is_strong_password(self, password):
if not password or len(password) < 8:
return (False, 'Minimum 8 caracteres')
if not any(c.isupper() for c in password):
return (False, 'Au moins une majuscule requise')
if not any(c.islower() for c in password):
return (False, 'Au moins une minuscule requise')
if not any(c.isdigit() for c in password):
return (False, 'Au moins un chiffre requis')
return (True, 'Mot de passe valide')