Psycopg2在保存到数据库之前更改密码值

时间:2019-04-09 07:18:07

标签: django python-3.x postgresql psycopg2 bcrypt

在保存到数据库之前,我正在使用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中。

1 个答案:

答案 0 :(得分:2)

发生的事情是,您的哈希(当前字节字符串)在保存到数据库之前已转换为hex,例如,如果您删除了开头\x243262...8626d36,则给出了\x的示例(顺便说一句,x表示十六进制)并将其转换为ascii,您可以再次获得哈希值。

解决方案:您只需要在将哈希存储到数据库之前添加以下内容即可:

hashedPass = hashedPass.decode('unicode_escape')