Недопустимая соль при использовании bcrypt.checkpw - PullRequest
0 голосов
/ 12 мая 2019

Я работаю над приложением для аутентификации пользователей, используя Django.Приложение позволяет пользователю создать учетную запись, а затем войти в систему.Тем не менее, на стороне входа в систему я получаю сообщение об ошибке при проверке пароля пользователя с помощью bcrypt.checkpw

Я попытался напечатать значение пароля пользователя и тот, который сохранен в базе данных.Я использую SQLite для базы данных:

print(request.POST['login_password'].encode())
print(user.password)

Вот вывод:

b'87654321'
b'$2b$12$bQ6tEDKh.tOJnnPAj84Xe.BZnGi9kI.Sc6Q4gFPeTLw9x53VSVQOW'

Я также попытался:

print(request.POST['login_password'].encode())
print(user.password.encode())

b'87654321'
b"b'$2b$12$bQ6tEDKh.tOJnnPAj84Xe.BZnGi9kI.Sc6Q4gFPeTLw9x53VSVQOW'"

Для создания пользователя:

user = MasjeedUser.objects.create(first_name=request.POST['first_name'],last_name=request.POST['last_name'],password=bcrypt.hashpw(request.POST['password'].encode(), bcrypt.gensalt()),email=request.POST['email'])

для запроса пароля:

при использовании

if bcrypt.checkpw(request.POST['login_password'].encode(),user.password)

я получаю сообщение об ошибке: Unicode-объекты должны быть закодированы перед проверкой

когда я пытался

if bcrypt.checkpw(request.POST['login_password'].encode(),user.password.encode())

я получаю как ошибку: недопустимая соль

1 Ответ

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

Причина, по которой вы имеете недопустимую соль, заключается в том, что у вас есть дополнительный b'...' вокруг хешированного пароля. Это потому, что результат hashpw является байтовой строкой, и Django автоматически вызовет str для всего, что передано в поле char, которое не является строкой. Сначала вам нужно будет его расшифровать.

Но в любом случае вы не должны делать ничего из этого . Хотя bcrypt - отличная библиотека хеширования, у вас нет причин дублировать функциональность, предоставляемую Django; тем самым вы почти наверняка представите новые уязвимости безопасности. Не делай этого. Унаследуйте ваш MasjeedUser от моделей AbstractUser или AbstractBaseUser в django.contrib.admin и используйте их методы set_password и check_password.

...