Psycopg2在保存到db之前更改密码值

问题描述 投票:1回答:1

在保存到数据库之前,我使用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中而不做任何更改。

django python-3.x postgresql psycopg2 bcrypt
1个回答
1
投票

会发生什么事情是你的哈希值(当前字节字符串)在保存到数据库之前被转换为hex,例如你给\x243262...8626d36的例子,如果你删除了开始\x(顺便说一句x表示十六进制)并将其转换为ascii你得到你的再次哈希回来。

解决方案:您只需要在将哈希值存储到数据库之前添加它:

hashedPass = hashedPass.decode('unicode_escape')
© www.soinside.com 2019 - 2024. All rights reserved.