在保存到数据库之前,我使用bcrypt来密码密码。使用的数据库是postgresql,与django一起使用的模块是psycopg2。
问题:在db中保存的散列密码和密码完全不同。无法弄清楚原因。
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中而不做任何更改。
会发生什么事情是你的哈希值(当前字节字符串)在保存到数据库之前被转换为hex
,例如你给\x243262...8626d36
的例子,如果你删除了开始\x
(顺便说一句x表示十六进制)并将其转换为ascii你得到你的再次哈希回来。
解决方案:您只需要在将哈希值存储到数据库之前添加它:
hashedPass = hashedPass.decode('unicode_escape')