首页 > 解决方案 > 在 mongoengine 中更新密码后,bcrypt(python)中的盐无效

问题描述

在使用 mongoengine 存储在 mongoDb 之前,我使用 bcrypt 对密码进行哈希处理。存储初始用户后,登录也可以正常工作。

我添加了一个更新密码的选项,在尝试使用更新的密码登录后,我收到以下与密码匹配的错误-

ValueError: Invalid salt

我在下面附加了 Document 类:

class Donator(Document):
    meta = {'collection': 'Donator'}
    user_name = StringField(required=True, unique=True)
    password = StringField(required=True)
    date_last_update = DateTimeField(default=datetime.utcnow)

这就是我做 POST、PUT 和登录的方式

salt = bcrypt.gensalt(8)

def add_donator_from_request(request):
    donor_old = get_donator_from_username(request.form['user_name'])
    if donor_old is not None:
        return "Donor already exist with username : " + str(request.form['user_name']), 401
    hashed = bcrypt.hashpw(request.form['password'].encode("utf-8"), salt)

    donor = Donator(password=hashed,
                    user_name=request.form['user_name'])

    donor.save()
    return donor.to_json(), 201


def login(request):
    donor = get_donator_from_username(request.form['user_name'])
    if donor is None:
        return "Donor does not exist with username: " + str(request.form['user_name']), 404
    else:
        password_utf8 = request.form['password'].encode("utf-8")
        if bcrypt.checkpw(password_utf8, donor.password.encode("utf-8")):
            return donor.to_json(), 200
        else:
            return "Wrong password for given username: " + str(request.form['user_name']), 401


def update_password_from_request(request):
    donor = get_donator_from_username(request.form["user_name"])
    if donor is None:
        return "Donor does not exist with username: " + str(request.form['donator_id']), 404
    else:
        hashed = bcrypt.hashpw(request.form['password'].encode("utf-8"), salt)
        donor.update(password=str(hashed),
                     date_last_update=datetime.utcnow)
        donor.reload()
        return donor.to_json(), 201

如果我在更新时没有将 str() 放在散列密码上,我会收到以下错误

mongoengine.errors.ValidationError: StringField only accepts string values

但是,在最初制作对象时,同一行代码可以正常工作,没有任何问题。

我无法理解我哪里出错了。谢谢

标签: pythonmongodbbcryptmongoengine

解决方案


推荐阅读