我想将md5的盐分更改为与我在apapplication中定义的盐分相同。这样,我将能够通过django管理页面为那些与将在我的应用程序中注册的用户具有相同盐分的用户创建用户。 这是我的settings.py
# Password hashers
PASSWORD_HASHERS = [
'django.contrib.auth.hashers.MD5PasswordHasher',
]
我的forms.py
SEL = 'TD-TP 430';
class InscriptionForms(forms.Form):
# code here
# Pour valider le champ Mot de passe
def clean_mdp(self):
mdp = self.cleaned_data['mdp'];
if len(mdp) == 0:
raise forms.ValidationError(
("Mot de passe ne peut etre vide."),
code='Mot_de_passe_vide'
);
else:
validate_password(mdp);
mdp_crypte_md5 = make_password(password=mdp, salt=SEL, hasher='md5');
return mdp_crypte_md5;
class ConnexionForms(forms.Form):
# code here
# Pour de le mot de passe
def clean_mdp(self):
mdp = self.cleaned_data['mdp'];
if len(mdp) == 0:
raise forms.ValidationError(
("Mot de passe incorrect."),
code='Mot de passe_est_vide'
);
else:
mdp_crypte_md5 = make_password(password=mdp, salt=SEL, hasher='md5');
return mdp_crypte_md5;
views.py
SEL = 'TD-TP 430'
# La page index qui est la page de connexion de site.
def index(request):
if request.method == 'POST':
connexion_form = ConnexionForms(request.POST);
if connexion_form.is_valid():
identifiant = connexion_form.clean_identifiant();
mdp = make_password(password=request.POST.get('mdp'), salt=SEL, hasher='md5')
user = authenticate(username=identifiant, password=mdp);
if user is not None:
login(request, user)
# ....
def inscription(request):
if request.method == 'POST': # S'il s'agit d'une requete "post" pour se connecter
inscription_form = InscriptionForms(request.POST);
if inscription_form.is_valid():
#....
mdp = inscription_form.clean_mdp();
""" Créons le niveau de l'étudiant. pour cela nous devons obtenir l'identifiant de la filière
de ce dernier """
#id_filiere = list(Filiere.objects.filter(nom_filiere=filiere).values_list('id', flat=True));
fil = Filiere.objects.get(nom_filiere=filiere);
niv = Niveau.objects.create(niveau=niveau, filiere=fil);
# Créons l'utilisateur dont hérite l'étudiant
utilisateur = User.objects.create(username=nom_utilisateur, first_name=prenom,last_name=nom, \
email=mail, password=mdp);
#Créons l'étudiant en question
Etudiant.objects.create(matricule_etudiant=matricule, user=utilisateur, numero_tel=tel, \
niveau=niv);
return redirect('index');
#....
当我通过django管理页面创建用户时,我看到的盐味与'SEL'不同。我希望通过django管理页面创建的用户与将在我的应用程序中注册的用户具有相同的优势。
答案 0 :(得分:0)
首先,请开始编写Python,而不要尝试在此处编写任何其他语言。 Python行不以分号结尾,而测试变量是否为空的方法是进行if not <var>
。
第二,停止使用MD5。正如我所提到的,它非常不安全,其漏洞已被知晓多年。在您自己的代码中应该没有任何理由使用它。使用静态盐会使它变得更糟了。盐的全部目的是每次都不同,以防止使用彩虹表。
第三,永远不要直接调用clean_
方法。从form.cleaned_data
字典中获取数据-例如mdp = inscription_form.cleaned_data['mdp']
。
最后,停止所有这些操作。您已成功完成的所有工作都绕过了Django为您所做的工作,从而使您的代码更加不安全,不可维护且不可用。例如,没有理由在您的make_password
方法中调用clean_mdp
;在原始POST数据的视图中再次将其称为 的理由更少。这两个都是毫无意义的,因为 authenticate
已经做到了;这就是auth框架的重点。您无法登录的原因是,结果是要检查的密码被哈希了两次。
同样,在创建用户时,请不要显式哈希密码;将未加密的版本传递到user.set_password
,或者首先调用User.objects.create_user
。
所以。删除表单的clean_mdp
方法。删除PASSWORD_HASHERS
设置。删除该SEL
常量。登录视图应为:
if connexion_form.is_valid():
identifiant = connexion_form.cleaned_data['identifiant']
mdp = connexion_form.cleaned_data['mdp']
user = authenticate(username=identifiant, password=mdp)
if user is not None:
login(request, user)
,您的注册视图应为:
if connexion_form.is_valid():
mdp = connexion_form.cleaned_data['mdp']
...
utilisateur = User.objects.create_user(username=nom_utilisateur, first_name=prenom,last_name=nom, \
email=mail, password=mdp)
一切都会正常工作。