将存储的哈希密码与明文输入的用户密码进行比较

compare stored hash password with plaintext input user password

我使用 bcrypt 库存储了哈希密码,因此它总是在我的数据库中存储不同的哈希字符串。如果字符串值与商店密码不同,我如何比较它们?

@login.route('/log',methods=['POST'])
def login():
    error = None
    # get data from JSON
    body = request.get_json()

    # if data contains something
    if body != error:
        # Verification of POST method
        if request.method == 'POST':
            # bucle for empty values findings
            validation = all(x != "" for x in body.values())
            if validation:
                username_mod = body['username']
                password_mod = body['password_hash']
                forced = b"valentina"
                hashed = hashpw(password_mod.encode('utf-8'), gensalt())
                userMatch = User.query.filter_by(username=username_mod).first()
                store_password = userMatch.password_hash
                
                if checkpw(forced, hashed):
                    print("it matches")
                else:
                    print("they dont")
                
                
                if userMatch:
                    if checkpw(hashed, store_password):
                        pswd_match = True
                    else:
                        pswd_match = False

                if userMatch and pswd_match:
                    return msg_handler("user allowed", 200)
                else:
                    return msg_handler("user denied", 400)
            else:
                return msg_handler("missing value in 1 or more parameters", 400)
        else:
            return msg_handler("Must be POST method", 400)
    else:
        return msg_handler("no data", 400)
我附上我的调试

在我看来,每次对密码进行哈希处理时,您都在生成新的盐。 salt 是一个随机生成的值,在对密码进行哈希处理之前附加到密码。

如果你和我都选择 abc123 作为我们的密码,那么我们的密码哈希值也会相同。如果有人发现我的密码是 abc123,并且他们看到您的哈希值相同,那么他们也会知道您的密码。现在假设我的密码是 abc123,但是当它被散列时,它会在开头粘贴一些随机字节,比如 7c6。然后它存储我的盐 7c67c6abc123 的散列。您仍然使用 abc123 作为您的密码,但它会随机生成 9er 作为您的盐。然后它存储 9er 作为你的盐,以及 9erabc123 的散列。现在我们的哈希看起来不一样了,即使我们的密码是一样的。

请注意,盐是未加密存储的。这样你就可以输入你的密码,它可以把盐放在密码的前面,然后对盐+密码组合进行哈希处理。该散列是需要与存储的散列进行比较的内容。如果你每次都生成一个新的盐,那么每次的哈希值都会不同。

所以,这部分:

hashed = hashpw(password_mod.encode('utf-8'), gensalt())

不应生成新的盐。它需要重新使用以前使用(和存储)的盐。

我使用 werkzeug.security 解决了我的问题 现在我的代码是这样的:

from werkzeug.security import generate_password_hash, check_password_hash

username_mod = body['username']
            password_mod = body['password_hash']
            userMatch = User.query.filter_by(username=username_mod).first()
            store_password = userMatch.password_hash

            if userMatch:
                if check_password_hash(store_password, password_mod ):
                    pswd_match = True
                else:
                    pswd_match = False

            if userMatch and pswd_match:
                return msg_handler("user allowed", 200)
            else:
                return msg_handler("user denied", 400)