【发布时间】:2018-03-01 07:11:39
【问题描述】:
我需要一个帮助。使用 Python 登录时,我需要使用用户输入密码验证散列密码。我在下面解释我的代码。
from bcrypt import hashpw, gensalt
def signsave(request):
"""This function helps to save signup data"""
if request.method == 'POST':
name = request.POST.get('uname')
password = request.POST.get('pass')
con_pass = request.POST.get('conpass')
if password == con_pass:
hashed = hashpw(password.encode('utf8'), gensalt(13))
passw = User(
uname=name,
password=hashed
)
passw.save()
message = "Registered successfully"
return render(request, 'bookingservice/login.html',
{'msg': message})
else:
message = "The password did not match "
return render(request, 'bookingservice/signup.html',
{'msg': message})
在这里,我使用 Bcrypt 对用户输入的密码进行哈希处理并将其存储到数据库中。
def loginsave(request):
"""This function helps to login the user """
if request.method == 'POST':
password = request.POST.get('pass')
uname = request.POST.get('uname')
if password == '':
return render(request, 'bookingservice/login.html', {})
else:
per = User.objects.all().filter(Q(uname__icontains=uname)).count()
if per > 0:
user = User.objects.filter(Q(uname__icontains=uname))
for use in user:
uid = use.id
user_name = use.uname
enc_pass = use.password
hashed = hashpw(password.encode('utf8'), gensalt(13))
if hashpw(password.encode('utf8'), hashed) == enc_pass:
request.session['id'] = uid
return render(request, 'bookingservice/home.html',
{'count': per, 'username': user_name})
else:
return render(request, 'bookingservice/login.html', {})
else:
return render(request, 'bookingservice/login.html', {})
在这里,我从数据库中检索散列密码并将其与用户输入值匹配。在这种情况下,用户登录时有效密码也不匹配。我需要密码以散列格式存储在数据库中的任何内容,当用户登录时将再次匹配。请帮忙。
【问题讨论】:
-
没用过bcrypt,但你不觉得你也应该保存你的salt值吗?生成盐的原因可能不同
-
你能把这个改正吗,但我的要求是我必须使用
Bcrypt哈希算法。 -
我建议您生成盐,然后将其保存在用户模型中。验证登录时,获取哈希密码,哈希时使用的盐,然后检查输入的密码是否与保存的密码匹配