首页 > 解决方案 > 更改 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 管理页面创建的用户与将在我的应用程序中注册的用户具有相同的加盐。

标签: djangoadminmd5

解决方案


首先,请开始编写 Python 而不是您要在这里编写的任何其他语言。Python 行不以分号结尾,测试变量是否为空的方法是 do if not <var>

其次,停止使用MD5。正如我所提到的,它非常不安全,而且它的漏洞已为人所知多年。不应该有任何理由在您自己的代码中使用它。而且使用静态盐会使情况变得更糟;盐的全部意义在于每次都不同,以防止使用彩虹表。

第三,你不应该clean_直接调用方法。从form.cleaned_datadict-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)

一切都应该工作。


推荐阅读