Изменить по умолчанию соленость md5 от django - PullRequest
0 голосов
/ 08 мая 2019

Я хочу изменить соленость 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, имели такой же цвет, как и те, кто будет регистрироваться в моем приложении.

1 Ответ

0 голосов
/ 09 мая 2019

Прежде всего, пожалуйста, начните писать на Python, а не на любом другом языке, который вы пытаетесь написать здесь. Строки Python не заканчиваются точками с запятой, и способ проверить, является ли переменная пустой, должен сделать if not <var>.

Во-вторых, прекратите использовать MD5. Как я уже упоминал, он ужасно небезопасен, а его уязвимости известны годами. Не должно быть никаких причин использовать его в своем собственном коде. И вы делаете это намного хуже с помощью статической соли; весь смысл соли в том, что она каждый раз отличается, чтобы не использовать радужные столы.

В-третьих, вы никогда не должны вызывать методы clean_ напрямую. Получите данные из form.cleaned_data dict - например, 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)

и все должно работать.

...