【问题标题】:could not validate with the hashed password using Python无法使用 Python 验证散列密码
【发布时间】: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 哈希算法。
  • 我建议您生成盐,然后将其保存在用户模型中。验证登录时,获取哈希密码,哈希时使用的盐,然后检查输入的密码是否与保存的密码匹配

标签: python hash bcrypt


【解决方案1】:

盐被 bcrypt 存储在密码的哈希值中。

在 bcrypt 中使用checkpw 方法。


from bcrypt import hashpw, gensalt, checkpw

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'), user_salt)
            if hashpw(password.encode('utf8'), hashed) == enc_pass:
            if checkpw(password, 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', {})

【讨论】:

  • 按照您的要求进行操作,但登录时出现错误Unicode-objects must be encoded before hashing
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-12-29
  • 1970-01-01
  • 1970-01-01
  • 2020-08-16
  • 2016-05-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多