如何将散列密码存储到数据库?

How to store a hashed password to database?

我正在使用 Python 3mysql.connector 模块。我无法将 hased 密码存储到数据库中。

这是我的代码:

import bcrypt
import base64, hashlib
import mysql.connector

class test:
    def __init__(self):
        self.cnx = mysql.connector.connect(**Connect)
        self.cursor = self.cnx.cursor()

        pw = "Test123!"
        password=pw.encode('utf-8')
        
        hash_pass = bcrypt.hashpw(base64.b64encode(hashlib.sha256(password).digest()),bcrypt.gensalt())
        print(hash_pass)

        self.cursor.execute("INSERT INTO test (password) VALUE ('%s')" % (hash_pass))
        self.cnx.commit()

test()

当我运行语句INSERT时,出现错误:

mysql.connector.errors.ProgrammingError: 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'bJo8.yam0VU5IKQxMa4EV.ReuFGeG43wmzbrFDsT5Pr5c8L2rmlP6'')' at line 1

注意:我的 password 数据类型是 CHAR(96)

感谢您的帮助。

使用查询参数代替 string-formatting。

// WRONG
self.cursor.execute("INSERT INTO test (password) VALUE ('%s')" % (hash_pass))

// RIGHT
self.cursor.execute("INSERT INTO test (password) VALUE (%s)", (hash_pass,))

这两种方法都使用 %s 作为占位符,这有点令人困惑,因为它看起来像是在做同样的事情。但后者并没有进行简单的字符串替换。它通过转义特殊字符或使用真正的查询参数使 SQL 查询的值安全,在查询被解析之前保持值独立。