在保存到数据库之前,我正在使用bcrypt对密码进行哈希处理。使用的数据库是postgressql,而与django一起使用的模块是psycopg2。
问题:哈希密码和保存在数据库中的密码完全不同。不知道为什么。
salt = bcrypt.gensalt();
hashedPass = bcrypt.hashpw(newPass.encode('utf-8'), salt);
print(hashedPass)
# b'$2b$12$5zbvakw7gD/BAW9jqrQ98eWUG4R8L6d68J5vvc9A16n..ypaMHbm6'
success = changePassword(user["id"], hashedPass)
def changePassword(id, newPassword):
try:
q = (
"UPDATE user_account SET password = %(newPassword)s "
"WHERE id = %(id)s "
)
with connection.cursor() as cursor:
print(newPassword)
#b'$2b$12$5zbvakw7gD/BAW9jqrQ98eWUG4R8L6d68J5vvc9A16n..ypaMHbm6'
cursor.execute(q, { "id": id, "newPassword": newPassword })
return True
except Exception as e:
return False
#password field defination in model
password = models.CharField(max_length=200)
# print of cursor.mogrify
b"UPDATE user_account SET password = '\\x243262243132246f2e5932456d6c344f35393355534c6e42784b55547543346b412f6a683037656f415473795569486e4f594d617931456b78585136'::bytea WHERE id = 20 "
哈希密码b'$2b$12$5zbvakw7gD/BAW9jqrQ98eWUG4R8L6d68J5vvc9A16n..ypaMHbm6'
的值
密码存储在db中时的值。 \x24326224313224357a6276616b773767442f424157396a7172513938655755473452384c366436384a35767663394131366e2e2e7970614d48626d36
我希望哈希密码无需更改就可以保存在db中。
答案 0 :(得分:2)
发生的事情是,您的哈希(当前字节字符串)在保存到数据库之前已转换为hex
,例如,如果您删除了开头\x243262...8626d36
,则给出了\x
的示例(顺便说一句,x表示十六进制)并将其转换为ascii,您可以再次获得哈希值。
解决方案:您只需要在将哈希存储到数据库之前添加以下内容即可:
hashedPass = hashedPass.decode('unicode_escape')