更改django默认的md5加盐

Change the default md5 salting of django

我想将 md5 的加盐更改为与我在应用程序中定义的相同。这样我就可以通过 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 管理页面创建的用户与将在我的应用程序中注册的用户具有相同的加盐。

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

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

第三,永远不要直接调用 clean_ 方法。从 form.cleaned_data 字典获取数据 - 例如 mdp = inscription_form.cleaned_data['mdp'].

最后,停止做这一切。你所成功做的就是绕过 Django 为你做的事情,使你的代码安全性、可维护性和可用性大大降低。例如,没有理由在 clean_mdp 方法中调用 make_password;甚至没有理由在视图中针对原始 POST 数据再次调用它 。这两个都是毫无意义的,因为 authenticate 已经做到了;这就是授权框架的重点。您的登录不起作用的原因是结果是要检查的密码被散列两次。

同样,当您创建用户时,不要显式地散列密码;首先将未散列的版本传递给 user.set_password, or just call 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)

一切正常。