django - 更改 django 的默认 md5 salting
问题描述
我想将 md5 的加盐更改为与我在应用程序中定义的相同。这样,我将能够通过 django 管理页面为那些与将在我的应用程序中注册的人具有相同盐分的人创建用户。这是我的settings.py
# Password hashers
PASSWORD_HASHERS = [
'django.contrib.auth.hashers.MD5PasswordHasher',
]
我的表格.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;
视图.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 管理页面创建的用户与将在我的应用程序中注册的用户具有相同的加盐。
解决方案
首先,请开始编写 Python 而不是您要在这里编写的任何其他语言。Python 行不以分号结尾,测试变量是否为空的方法是 do if not <var>
。
其次,停止使用MD5。正如我所提到的,它非常不安全,而且它的漏洞已为人所知多年。不应该有任何理由在您自己的代码中使用它。而且使用静态盐会使情况变得更糟;盐的全部意义在于每次都不同,以防止使用彩虹表。
第三,你不应该clean_
直接调用方法。从form.cleaned_data
dict-eg中获取数据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)
一切都应该工作。
推荐阅读
- .net - 在 vb.net 中使用数组值过滤通用列表
- javascript - 如何在 JDEV 12c 中使用 Javascript 单击时设置链接样式
- vue.js - 哈希模式下的 VueJS 路由器:如果找不到文件,则路由到错误页面
- php - 尝试使用包含变量的 php 重命名函数
- javascript - 如何在 D3 中附加多个矩形?
- c# - 如何访问 form1.cs 中的任务表单 program.cs
- tinymce - 如何避免内联工具栏自动隐藏在tinymce中?
- java - Appium Android 失败 adb pm pull 命令
- python - matplotlib 在多个文件中错误地绘制
- java - Android studio 文件浏览器