将存储的哈希密码与明文输入的用户密码进行比较
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
。然后它存储我的盐 7c6
和 7c6abc123
的散列。您仍然使用 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)
我使用 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
。然后它存储我的盐 7c6
和 7c6abc123
的散列。您仍然使用 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)