Django check_password () всегда возвращает False - PullRequest
1 голос
/ 08 апреля 2019

У меня есть существующая база данных, которая используется с приложением NodeJs, теперь эта же база данных будет использоваться для нового приложения, созданного с помощью Django.У меня есть таблица user_account, в которой хранятся учетные данные пользователя и для шифрования пароля * был использован модуль bcrypt . Пароль хранится в поле user_password

Я расширилDjango Users моделирует и переопределяет метод authencticate, который работает нормально.Для изменения пароля я использую bcrypt метод bcrypt.checkpw(password, hashed), который тоже работает нормально.

Проблема: Я хочу использовать django user.check_password(password) вместо bcrypt.checkpw(password, hashed).Так как это избавит от необходимости генерировать соль и кодировать до сопоставления пароля, и, прежде всего, это встроенный метод для единственной цели.

import bcrypt
from django.contrib.auth.hashers import check_password

#password = plain text password entered by user at login
#hashedPassword = Password stored in db (fieldName: user_password)
check_password(password, hashedPassword) #It returns False

user.check_password(password) # It also returns False

#for same password
bcrypt.checkpw(password, hashedPassword) # returns True

#hashedPassword format $2b$12$NNVaNL2Zla0E/WwC6Mkjjer6Qh3zIBCN6kMl9qxLE/xxyt4NAgXMq

Я использую Django 2.1 и Python 3.6

Я уже проверил связанные вопросы, но все они имели проблемы с формамии я не использую какую-либо форму django.

Мои settings.py хэши:

PASSWORD_HASHERS = [
    'django.contrib.auth.hashers.BCryptSHA256PasswordHasher',
    'django.contrib.auth.hashers.BCryptPasswordHasher',
    'django.contrib.auth.hashers.PBKDF2PasswordHasher',
    'django.contrib.auth.hashers.PBKDF2SHA1PasswordHasher',
    'django.contrib.auth.hashers.Argon2PasswordHasher',
]

Метод ввода - простой шаблон django

<div class='col-md-12'>
  <form action='/auth/login' method='post'>
    {% csrf_token %}
    <div class='form-group row'>
      <label for='email'>Email</label>
      <input type='email' class='form-control' id='email' name='username'>
    </div>
    <div class='form-group row'>
      <label for='password'>Password</label>
      <input type='password' class='form-control' id='password' name='password'>
    </div>
    <div class='form-group row'>
      <button class='btn btn-outline-secondary' type='submit'>Log in</button>
    </div>
  </form>
</div>

1 Ответ

2 голосов
/ 08 апреля 2019

Django не хранит необработанные хэши, им предшествует алгоритм (см. документация ).

Без префикса Django не сможет определить правильный хеш. Если вы посмотрите на источник check_password, вы увидите, что он возвращает False, если не удается определить хэши паролей.

Самым чистым решением, вероятно, будет пользовательский сервер аутентификации с непосредственным использованием bcrypt.checkpw.

...